Неявное преобразование типов
Поведение диалектов 1 и 3 различно при неявном преобразовании типов. Это может стать проблемой, если вам нужно преобразовать существующую базу данных в диалект 3 и изменить использующие их приложения.
* В диалекте 1 для некоторых выражений Firebird выполняет автоматическое преобразование данных в эквивалентные типы данных (неявное преобразование типов). Здесь также может быть использована функция CAST(), хотя в большинстве случаев она не нужна.
* В диалекте 3 в условиях поиска требуется функция CAST() для явной трансляции одного типа данных в другой для операций сравнения.
Например, сравнение столбца типа DATE или TIMESTAMP с '12/31/2003' в диалекте 1 приводит к неявному преобразованию строкового литерала '12/31/2003' в тип данных DATE.
SELECT * FROM TABLE_A
WHERE START_DATE < '12/31/2003';
В диалекте 3 требуется явное преобразование:
SELECT * FROM TABLE_A
WHERE START_DATE < CAST ('12/31/2003' AS DATE);
В выражениях, где смешиваются целые данные и числовые строки, в диалекте 1 строки неявно преобразуются в целое, если это возможно. В следующей операции:
3 + '1'
диалект 1 автоматически преобразует символ "1" в SMALLINT, в то время как диалект 3 вернет ошибку. Он требует явного преобразования типов:
3 + CAST('1' AS SMALLINT)
Оба диалекта вернут ошибку в следующем операторе, потому что Firebird не может преобразовать символ "а" в целое:
3 + 'а'
Явное преобразование типов: CAST()
В тех случаях, когда Firebird не может выполнить неявное преобразование типов, вы должны выполнить явное преобразование типов посредством функции CAST(). Используйте CAST() для преобразования одного типа данных в другой в операторе SELECT обычно в предложении WHERE для сравнения различных типов данных. Синтаксис функции:
CAST (значение | NOLL AS тип данных)
Вы можете использовать CAST() для сравнения столбцов с различными типами данных в той же таблице или из различных таблиц. Например, вы можете преобразовывать правильно сформированную строку в типы дата/время, а также во множество числовых типов. Подробную информацию о преобразованиях типов данных смотрите в остальных главах этой части.
Изменение определения столбцов и доменов
В обоих диалектах вы можете изменять тип данных доменов и столбцов в таблицах. Если вы выполняете миграцию базы данных из другой СУБД, это может быть полезным. Существуют некоторые ограничения при изменении типа данных.
* Firebird не допускает изменения типа данных столбца или домена, которое может привести к потере данных. Например, количество символов в столбце не может быть меньше наибольшего размера столбца.
* Преобразование числового типа данных в строковый требует минимального размера строкового типа, как показано в табл. 8.3.
Таблица 8.3. Минимальное количество символов для числовых преобразований
Тип данных |
Минимальная длина символьного типа |
BIGINT |
19 (или 20 для чисел со знаком) |
DECIMAL |
20 |
DOUBLE |
22 |
FLOAT |
13 |
INTEGER |
10 (11 для чисел со знаком) |
NUMERIC |
20 (или 21 для чисел со знаком) |
SMALLINT |
6 |
Изменение типа данных столбца
Используйте предложение ALTER COLUMN В операторе ALTER TABLE, например:
ALTER TABLE table1 ALTER COLUMN field1 TYPE char(20);
Информацию об изменении столбцов таблицы см. в разд. "Изменение таблиц" главы 16.
Изменение типа данных домена
Используйте предложение TYPE В операторе ALTER DOMAIN для изменения типа данных домена, например,
ALTER DOMAIN MyDomain TYPE VARCHAR(40);
На рис. 8.1 показаны допустимые преобразования типов данных. Более подробную информацию об изменении атрибутов домена см. в главе 13.
Ключевые слова, используемые для спецификации типа данных
Ключевые слова для спецификации типов данных в операторах DDL представлены здесь в качестве краткой справки. Точный синтаксис см. в соответствующей главе, связанной с типами данных этой части книги, а также в главах 13 и 16.
{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION} []
| {DATE | TIME | TIMESTAMP} []
| {DECIMAL INUMERIC} [ (precision [, scale])] []
{ {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(int)]
[] [CHARACTER SET charname]
| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}
[VARYING] [(int)] []
BLOB [SUB_TYPE int | subtype_name ] [SEGMENT SIZE int]
[CHARACTER SET charname]
BLOB [(seglen [, subtype])]
Рис. 8.1. Допустимые преобразования данных с использованием операторов ALTER COLUMN и ALTER DOMAIN
Специальная тема миграции: диалекты SQL
Если вы бывшие пользователи InterBase или вы использовали устаревшие инструменты миграции для конвертирования других СУБД в InterBase, то диалекты SQL видимо будут влиять на некоторые аспекты новой жизни ваших баз данных и приложений при использовании сервера Firebird.
Читать дальше