Поддержка типов данных

В отличие от большинства баз данных SQL, модуль базы данных SQL в Adobe AIR не требует, чтобы столбцы таблиц содержали значения определенного типа. Вместо этого среда выполнения использует для управления типами данных две концепции: классы хранения и сходство столбцов. В этом разделе описываются классы хранения и сходство столбцов, а также способы компенсации различий между типами данных в различных ситуациях.

Классы хранения

Классы хранения представляют действительные типы данных, которые служат для хранения значений в базе данных. База данных использует следующие классы хранения.

NULL
Значение — NULL.

INTEGER
Значение — целое число со знаком.

REAL
Значение — число с плавающей запятой.

TEXT
Значение — текстовая строка (размер до 256 МБ).

BLOB
Это значение представляет собой большой двоичный объект (англ. Binary Large Object, BLOB); другими словами, это необработанные двоичные данные (максимальный размер — 256 МБ).

Все значения, которые передаются в базу данных как литералы, встроенные в инструкцию SQL, или значения, связанные с подготовленной инструкцией SQL с помощью параметров, попадают в классы хранения до выполнения инструкции SQL.

Литералы, которые входят в состав инструкции SQL, относятся к классу хранения TEXT, если они заключены в одинарные или двойные кавычки, к классу INTEGER, если литерал определен как число без десятичного разделителя или экспоненты, не заключенное в кавычки, к классу REAL, если литерал является числом с десятичным разделителем или экспонентой, заключенным в кавычки, или к классу NULL, если литерал имеет значение NULL. Литералы с классом хранения BLOB определяются с использованием формата записи X'ABCD'. Дополнительные сведения см. в подразделе «Значения литералов» раздела «Выражения».

Значения, передаваемые как параметры с помощью ассоциативного массива SQLStatement.parameters, относятся к классу хранения, который ближе всего соответствует назначенному им собственному типу данных. Например, значения int относятся к классу хранения INTEGER, значения Number — к классу хранения REAL, значения String — к классу хранения TEXT, а объекты ByteArray — к классу хранения BLOB.

Сходство столбцов

Сходство столбца — это рекомендуемый тип для данных в таком столбце. Когда значение, сохраненное в столбце (с помощью инструкции INSERT или UPDATE), среда выполнения пытается преобразовать это значение из текущего типа данных в заданное сходство. Например, если значение Date (экземпляр Date в ActionScript или JavaScript) вставляется в столбец со сходством TEXT, перед сохранением в базе данных значение Date преобразуется в строковое представление String (что равносильно вызову метода объекта toString()). Если значение не удается преобразовать к заданному сходству, происходит ошибка и операция не выполняется. Когда значение получается из базы данных с помощью инструкции SELECT, оно возвращается как экземпляр класса, соответствующего сходству, независимо от того, было ли оно преобразовано из другого типа данных при сохранении.

Если столбец принимает значения NULL, нулевое значение ActionScript или JavaScript (null) может использоваться в качестве значения параметра для сохранения NULL в столбце. Когда значение класса хранения NULL извлекается из инструкции SELECT, оно всегда возвращается как нулевое значение ActionScript или JavaScript (null) независимо от сходства столбца. Если столбец принимает значения NULL, следует всегда проверять значения, извлекаемые из этого столбца, чтобы определить, равны ли они нулю, прежде чем выполнить попытку приведения значения к ненулевому типу (такому как Number или Boolean).

Каждому столбцу в базе данных назначается один из следующих сходств типа:

  • TEXT (или String)

  • NUMERIC

  • INTEGER (или int)

  • REAL (или Number)

  • Boolean

  • Date

  • XML

  • XMLLIST

  • Object

  • NONE

TEXT (или String)

Столбец со сходством TEXT или String хранит все данные, используя классы хранения NULL, TEXT или BLOB. Если числовые данные вставляются в столбец со сходством TEXT, перед сохранением они преобразуются в текст.

NUMERIC

Столбец со сходством NUMERIC содержит значения, используя классы хранения NULL, REAL или INTEGER. Когда текстовые данные вставляются в столбец NUMERIC, перед сохранением предпринимается попытка преобразовать их в целое или действительное число. В случае успешного преобразования значение сохраняется в классе хранения INTEGER или REAL (например, значение '10.05' перед сохранением преобразуется в класс хранения REAL). Если преобразование выполнить не удается, возникает ошибка. Если значение — NULL, попытка преобразования не предпринимается. Значение, полученное из столбца NUMERIC, возвращается как экземпляр самого точного числового типа, к которому можно отнести значение. Другими словами, если значение является положительным целым числом или 0, возвращается экземпляр uint. Если значение является отрицательным целым числом, возвращается экземпляр int. А если значение имеет часть с плавающей запятой (то есть не является целым числом), возвращается экземпляр Number.

INTEGER (или int)

По поведению столбец со сходством INTEGER напоминает столбец со сходством NUMERIC, но с одним исключением. Если сохраняемое значение является действительным числом (таким как экземпляр Number) без части после плавающей запятой или текстом, который можно преобразовать в действительное число без плавающей запятой, то оно преобразуется в целое число и сохраняется с использованием класса хранения INTEGER. При попытке сохранить действительное число с частью после плавающей запятой возникает ошибка.

REAL (или Number)

Столбец со сходством REAL или NUMBER ведет себя так же, как столбец с родственным типом NUMERIC. Однако здесь целочисленные значения принудительно преобразуются в представление с плавающей запятой. Значение в столбце REAL всегда возвращается из базы данных как экземпляр Number.

Boolean

Столбец со сходством Boolean хранит значения true (истина) или false (ложь). Столбец Boolean принимает значение, которое является экземпляром Boolean ActionScript или JavaScript. Если код пытается сохранить значение String, объект String с длиной больше нуля приравнивается значению true, а пустой объект String — значению false. Если код пытается сохранить числовые данные, любое ненулевое значение сохраняется как true, а 0 — как false. Когда логическое значение (Boolean) извлекается с помощью инструкции SELECT, оно возвращается как экземпляр Boolean. Ненулевые значения хранятся с использованием класса хранения INTEGER (0 — false и 1 — true) и преобразуются в объекты Boolean при извлечении данных.

Date

Столбец со сходством Date хранит значения даты и времени. Столбец Date может принимать значения, которые являются экземплярами Date в ActionScript или JavaScript. При попытке сохранить значение String в столбце Date среда выполнения преобразует его в дату по юлианскому календарю. Если выполнить преобразование не удается, выдается сообщение об ошибке. Если код пытается сохранить значение Number, int или uint, проверка данных не выполняется, а значение рассматривается как действительная дата по юлианскому календарю. Значение Date, полученное с помощью инструкции SELECT, автоматически преобразуется в экземпляр Date. Значения Date сохраняются как значения даты по юлианскому календарю с использованием класса хранения REAL, поэтому операции сравнения и сортировки выполняются в обычном порядке.

XML или XMLList

Столбец со сходством XML или XMLList содержит структуры XML. Когда код пытается сохранить данные в столбце XML при помощи параметра SQLStatement, среда выполнения пытается преобразовать и проверить значение с помощью функции ActionScript XML() или XMLList(). Если значение невозможно преобразовать в допустимый объект XML, происходит ошибка. При попытке сохранить данные с использованием текстового значения SQL литерала (например, INSERT INTO (col1) VALUES ('Invalid XML (no closing tag)'), синтаксический анализ или проверка значения не выполняется, поскольку его формат считается правильным. Если сохранить недопустимое значение, то при извлечении оно возвращает пустой объект XML. Значение Data XML и XMLList сохраняется с использованием класса хранения TEXT или NULL.

Object

Столбец со сходством Object содержит сложные объекты ActionScript или JavaScript, включая экземпляры класса Object, а также экземпляры подклассов Object, такие как экземпляры Array и даже экземпляры пользовательских классов. Сериализация данных столбца Object выполняется в формате AMF3, и они сохраняются с использованием класса хранения BLOB. При извлечении значения выполняется его десериализация из AMF3, и оно возвращается в виде экземпляра класса в том виде, в котором оно было сохранено. Обратите внимание, что некоторые классы ActionScript, в особенности объекты представления, можно десериализовать как экземпляры их исходного типа данных. Прежде чем сохранять экземпляр пользовательского класса, необходимо зарегистрировать псевдоним класса с помощью метода flash.net.registerClassAlias() (а в Flex можно добавить в объявление класса метаданные [RemoteObject]). Кроме того, перед извлечением таких данных необходимо зарегистрировать такой же псевдоним для класса. Любые данные, для которых нельзя правильно выполнить десериализацию по той причине, что класс изначально не поддается десериализации или псевдоним класса отсутствует или несогласован, возвращаются как анонимный объект (экземпляр класса Object) со свойствами и значениями, соответствующими изначально сохраненному экземпляру.

NONE

Столбец со сходством NONE не различает классы хранения. Попытка преобразования данных перед вставкой не предпринимается.

Определение сходства

Сходство типа столбца определяется по типу столбца, объявленному в инструкции CREATE TABLE. При определении типа действуют следующие правила (без учета регистра).

  • Если тип данных столбца содержит любые строки из CHAR, CLOB, STRI или TEXT, то столбец имеет сходство TEXT/String. Обратите внимание, что тип VARCHAR содержит строку CHAR и ему назначается сходство TEXT.

  • Если тип данных столбца содержит строку BLOB или тип данных не задан, то столбец имеет сходство NONE.

  • Если тип данных столбца содержит строку XMLL, то столбец имеет сходство XMLList.

  • Если тип данных столбца содержит строку XML, то столбец имеет сходство XML.

  • Если тип данных содержит строку OBJE, то столбец имеет сходство Object.

  • Если тип данных содержит строку BOOL, то столбец имеет сходство Boolean.

  • Если тип данных содержит строку DATE, то столбец имеет сходство Date.

  • Если тип данных содержит строку INT (включая UINT), ему назначается сходство INTEGER/int.

  • Если тип данных столбца содержит любые строки из REAL, NUMB, FLOA или DOUB, то столбец имеет сходство REAL/Number.

  • В противном случае сходством будет NUMERIC.

  • Если таблица создана с помощью инструкции CREATE TABLE t AS SELECT..., то тип данных для всех столбов не задается, и им назначается сходство NONE.

Типы данных и операторы сравнения

Поддерживаются операторы двоичного сравнения =, <, <=, >= и !=, а также операция проверки заданного членства, оператор IN и оператор троичного сравнения BETWEEN. Дополнительные сведения об этих операторах см. в разделе «Операторы».

Результат сравнения зависит от классов хранения двух сравниваемых значений. При сравнении двух значений действуют следующие правила.

  • Значение с классом хранения NULL считается меньшим по отношению к любому другому значению (включая другое значение с классом хранения NULL).

  • Значение INTEGER или REAL меньше любого значения TEXT или BLOB. При сравнении INTEGER или REAL с другим значением INTEGER или REAL выполняется сравнение чисел.

  • Значение TEXT меньше значения BLOB. При сравнении двух значений TEXT выполняется двоичное сравнение.

  • При сравнении двух значений BLOB результат всегда определяется путем двоичного сравнения.

Троичный оператор BETWEEN всегда преобразуется в эквивалентное двоичное выражение. Например, a BETWEEN b AND c преобразуется в a >= b AND a <= c, даже если это означает, что к a применяются разные сходства при каждом сравнении, необходимом для вычисления выражения.

Выражения типа a IN (SELECT b ....) следуют трем правилам, перечисленным ранее для двоичного сравнения, то есть аналогичны a = b. Например, если b — это значение столбца, а a — выражение, то сходство b применяется к a перед любым сравнением. Выражение a IN (x, y, z) преобразуется к a = +x OR a = +y OR a = +z. Значения справа от оператора IN (в приведенном примере это значения x, y и z) считаются выражениями, даже если они являются значениями столбца. Если значение слева от оператора IN является столбцом, то используется сходство этого столбца. Если значение является выражением, то преобразование не выполняется.

На порядок выполнения сравнения может также влиять предложение COLLATE. Дополнительные сведения см. в разделе «COLLATE».

Типы данных и математические операторы

Для каждого из поддерживаемых математических операторов *, /, %, + и - перед вычислением выражения к каждому операнду применяется сходство NUMERIC. Если какой-либо операнд не удается успешно преобразовать в класс хранения NUMERIC, результатом выражения будет NULL.

При использовании оператора сцепления перед вычислением выражения || каждый операнд преобразуется в класс хранения TEXT. Если какой-либо операнд не удается преобразовать в класс хранения TEXT, результатом выражения будет NULL. Значение невозможно преобразовать в двух случаях: если значение операнда — NULL, или если это объект BLOB с классом хранения, отличным от TEXT.

Типы данных и сортировка

При сортировке значений при помощи предложения ORDER BY на первое место ставится класс хранения NULL. Затем следуют значения INTEGER и REAL в числовом порядке, далее значения TEXT в двоичном порядке или в зависимости от заданной сортировки (BINARY или NOCASE). Завершают список значения BLOB в двоичном порядке. Перед сортировкой преобразования классов хранения не выполняется.

Типы данных и группировка

При группировке значений с помощью предложения GROUP BY значения с различными классами хранения считаются разными. Исключением являются значения INTEGER и REAL, которые считаются равными, если их числа эквивалентны. При использовании предложения GROUP BY к значениям не применяется сходство.

Типы данных и составные инструкции SELECT

Составные операторы SELECT (UNION, INTERSECT и EXCEPT) выполняют неявное сравнение значений. Перед выполнением этих сравнений к каждому значению может применяться сходство. Ко всем значениям, которые могут быть возвращены в одном столбце набора результатов составной инструкции SELECT, применяется одно и то же сходство, если имеется. Применяемое сходство является сходством столбца, который возвращается первым компонентом инструкции SELECT и имеет значение столбца (а не какой-либо другой тип выражения) в этом положении. Если для заданного столбца составной инструкции SELECT ни один из компонентов инструкции SELECT не возвращает значение столбца, то к значениям этого столбца не применяется сходство перед сравнением.