Выбрать главу

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} [<array_dim>]

| {DATE | TIME | TIMESTAMP} [<array_dim>]

| {DECIMAL INUMERIC} [ (precision [, scale])] [<array_dim>]

{ {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(int)]

[<array_dim>] [CHARACTER SET charname]

| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}

[VARYING] [(int)] [<array_diin>]

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.

ODS и диалект

Структура данных на диске (On-Disk Structure, ODS) идентифицирует базу данных в отношении версии релиза сервера Firebird или InterBase, который создает и восстанавливает базу данных. ODS базы данных влияет на совместимость с версиями сер- вера. Файл, подходящий для обновления ODS, может быть создан резервным копированием базы данных (backup) с использованием утилиты gbak той версии, в которой была создана база данных. Утилита должна быть использована с переключателем -t[ransportable]. Когда файл резервной копии будет восстановлен с использованием gbak новой версии, восстановленная база данных будет иметь новую версию ODS. Такое невозможно выполнить для "понижения" ODS для любой базы данных.

Использование gbak подробно обсуждается в главе 38.

Обновление ODS не изменяет диалект

Обновление ODS не влияет на диалект SQL базы данных: база данных диалекта 1 останется базой данных диалекта 1.

Базы данных Firebird

Firebird 1.0.x имеет ODS, обозначаемый как ODS-10. Firebird 1.5 имеет ODS-10.1. Чтобы преобразовать базу данных ODS-10, созданную в Firebird 1.0.x в ODS-10.1, вам просто нужно сделать ее резервную копию и восстановить эту копию с использованием gbak из Firebird 1.5. По умолчанию серверы Firebird версий 1.0.3+ и 1.5 создают базы данных диалекта 3. Для проверки ваших баз данных см. разд. "Как определить диалект" далее в этой главе.

Базы данных InterBase 6.0.x

OpenSource InterBase версий 6.0.x имеют ODS-10. Тем не менее для обновления баз данных InterBase 6.0.x до любой версии Firebird рекомендуется использовать gbak из InterBase 6.0 с переключателем -t[ransportable]. Файл резервной копии должен быть затем восстановлен с использованием gbak соответствующей версии сервера Firebird.

Если база данных InterBase 6.0 была создана с установками по умолчанию, то, вероятно, она имеет диалект 1. См .разд. "Как определить диалект" далее в этой главе.

Базы данных InterBase 5.x

Базы данных InterBase 5 имеют ODS-9 (9.0 и 9.1). Серверы Firebird могут открывать их, читать как базы данных диалекта 1, но дальнейшая работа с этими базами данных в InterBase 5.x не рекомендуется.

! ! !

ПРИМЕЧАНИЕ. Сервер Firebird не может создавать базы данных с ODS-9. Базы данных диалекта 1, созданные сервером Firebird, не могут быть использованы сервером InterBase 5.x.

. ! .

Не существует такой вещи, как база данных ODS-9 диалекта 1 или диалекта 3. Для обновления базы данных ODS-9 до Firebird используйте программу gbak из InterBase 5.x, запущенную с сервера InterBase 5.6 с переключателем -t[ransportable]. Обновление базы данных InterBase 5.x до Firebird не преобразует ее в диалект 3 базы данных. Ее SQL диалект будет 1, и это обновление является необратимым.

Где учитывается диалект

Концепция диалекта различает способ поддержки типов данных и возможности языка, доступные в базах данных с ODS-9 (диалект 1) и ODS-10 и выше (диалект 3). Сам сервер не имеет "диалекта" - диалект базы данных сохраняется как атрибут базы данных. Он является интерфейсом клиента, который определяет, какой набор возможностей запрашивается у базы данных. При некоторых условиях, если вы как разработчик приложений или пользователь инструментов администратора используете его неправильно, вы получите ошибочные данные, сохраняемые в базе, что может привести к некорректной работе приложений и базы данных.