Шрифт:
Интервал:
Закладка:
В обоих диалектах вы можете изменять тип данных доменов и столбцов в таблицах. Если вы выполняете миграцию базы данных из другой СУБД, это может быть полезным. Существуют некоторые ограничения при изменении типа данных.
* 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.
Базы данных FirebirdFirebird 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.xOpenSource 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). Сам сервер не имеет "диалекта" - диалект базы данных сохраняется как атрибут базы данных. Он является интерфейсом клиента, который определяет, какой набор возможностей запрашивается у базы данных. При некоторых условиях, если вы как разработчик приложений или пользователь инструментов администратора используете его неправильно, вы получите ошибочные данные, сохраняемые в базе, что может привести к некорректной работе приложений и базы данных.
Здесь удобно обратиться к экземпляру клиентского соединения, выполненного с помощью библиотеки API или пользовательского драйвера языка, такого как JayBird (Java), ODBC или провайдер .NET, как "клиент диалекта 1" или "клиент диалекта 3". Это означает, что интерфейс клиента будет установлен для получения возможностей диалекта 1 или 3.
Что можно отброситьСледующий список иллюстрирует некоторые отличия диалекта 1 от диалекта 3.
* Диалекты 1 и 3 хранят большие масштабируемые числа по-разному. В диалекте 3 все типы с фиксированной точкой (NUMERIC и DECIMAL), имеющие точность больше 10, являются 64-битовыми целыми с описанием, которое включает некоторые атрибуты для определения точности и масштаба. В диалекте 1 числа с фиксированной точкой хранятся как 16- или 32-битовые целые, а числа с точностью, превышающей 10, преобразуются для хранения в 64-битовый тип числа с плавающей точкой DOUBLE PRECISION. Ваши данные, вероятно, вызовут ошибку переполнения, если клиент диалекта 3 выдаст запрос на сохранение числа в базе данных диалекта 1, или сгенерируют ошибочный результат, когда клиент диалекта 1 выдаст запрос на операции с числами в базе данных диалекта 3.
* Генераторы в диалекте 3 являются 64-битовыми целыми, в то время как в диалекте 1 генераторы - 32-битовые целые.
* Арифметические операции в диалекте 3 были взяты из стандарта SQL-92, в то время как диалект 1 использует нестандартные правила. Например, деление целого на целое в диалекте 3 возвращает усеченное целое, в то время как в диалекте оно вернет число с плавающей точкой двойной точности. Если ваше приложение сохраняет результат выражения, включающего подобную арифметическую операцию, "ошибочные" результаты будут сохранены без возбуждения исключения.
* Оба диалекта имеют тип данных даты и времени с именем DATE, но это разные типы. В диалекте 1 тип DATE эквивалентен типу TIMESTAMP диалекта 3, а в диалекте 3 DATE является типом, хранящим только дату; этот тип не поддерживается в диалекте 1.
* Диалект 3 поддерживает тип TIME (время дня), который отсутствует в диалекте 1.
* В базах данных диалекта 3 Firebird поддерживает соглашения ANSI SQL по идентификаторам с разделителями, которые заключаются в двойные кавычки; такие
идентификаторы не могут использоваться в диалекте 1. Несоответствие диалектов клиента и базы данных приведет к исключениям и некорректной работе.
* Диалект 3 имеет больше зарезервированных ключевых слов, чем диалект 1. Существующие базы данных диалекта 1, которые используют новые ключевые слова в качестве идентификаторов, не будут работать с клиентом диалекта 3.
* Диалекты 1 и 3 ведут себя по-разному в случае неявного преобразования типов. Это может стать проблемой, если вы хотите конвертировать существующую базу данных в диалект 3 и изменять использующие ее приложения.
Диалект 2Не существует такого предмета, как "база данных диалекта 2". Диалект 2 является клиентской установкой, которую вы можете использовать для проверки переходных требований типов данных при конвертировании базы данных диалекта 1 в диалект 3. Inprise Corporation (теперь Borland) разработала документ "Migration Guide" (Руководство по миграции) для InterBase 6.0 в 2000 году, где подробно описаны действия по конвертированию баз данных диалекта 1 в диалект 3. Этот документ в формате PDF доступен на некоторых сайтах сообщества Firebird.
- Delphi. Учимся на примерах - Сергей Парижский - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Психбольница в руках пациентов - Алан Купер - Программирование