Опубликован: 07.05.2010 | Уровень: специалист | Доступ: платный
Лекция 16:

Типы данных. Домены

< Лекция 15 || Лекция 16: 12 || Лекция 17 >

Текстовые типы

Существует два текстовых типа данных: CHARACTER(n) (в сокращенном варианте CHAR(n)CHARACTER VARYING(n) (в сокращенном варианте VAR CHAR(n) ).

n - указывает количество символов в поле. В обоих типах n может быть от 1 до 32767 символов (32 Кбайт). Если n не указать, по умолчанию будет присвоено число 1. Пример создания полей:

CREATE TABLE Table_Text(
   Kol_Char CHAR,
   Kol_Varchar VARCHAR(255))

В первом случае будет создано поле размером 1 символ, во втором случае в поле можно сохранить текст размером до 255 символов. Между этими типами данных есть отличия. Тип CHAR предназначен для хранения текста фиксированной длины. Другими словами, если мы определим поле в 10 символов, а запишем только 5, то текст будет дополнен завершающими пробелами до полной длины. Тип VARCHAR хранит текст переменной длины, и возвращает сохраненный текст без завершающих пробелов. Тем самым, использование типа VARCHAR в большинстве случаев является предпочтительным.

Еще важными факторами при работе с текстовыми полями является кодировка символов и порядок их сортировки. Как мы знаем из прошлой лекции, при создании базы данных можно указать кодировку "по умолчанию", для кириллицы предпочтительней будет кодировка WIN1251. При этом все создаваемые текстовые поля будут иметь эту кодировку, в чем несложно убедиться, выполнив описанный выше запрос, и посмотрев вкладку Metadata созданной таблицы:

Установки кодировки "по умолчанию"

Рис. 16.5. Установки кодировки "по умолчанию"

Как видно из рисунка, с помощью оператора CHARACTER SET кодировку можно указать явно при описании поля:

CREATE TABLE Table_Text2(
   Kol_Char CHAR CHARACTER SET WIN1251,
   Kol_Varchar VARCHAR(255) CHARACTER SET ASCII)

Если кодировка указана явно, именно она и будет использована при создании столбца таблицы.

Для символьных полей также возможно указывать порядок сортировки COLLATE. Этот порядок определяет способ, по которому будут сортироваться и сравниваться текстовые данные при выводе их оператором SELECT. Для кодировки WIN1251 это может быть сортировка WIN1251 или PXW_CYRL. В первом случае русские символы сортируются как

АБВ….эюя

что не очень удобно. Сортировка PXW_CYRL предпочтительней, она выводит русские символы в таком порядке:

аАбБ…яЯ

Пример:

CREATE TABLE Table_Text3(
   Kol_Char CHAR CHARACTER SET WIN1251 COLLATE WIN1251,
   Kol_Varchar VARCHAR(255) CHARACTER SET WIN1251 COLLATE PXW_CYRL)

Тип данных BLOB

BLOB ( Binary Large Object - Большой двоичный объект) - Поле неограниченного размера, может содержать любой тип двоичных данных, например, файл с фотографией, мелодией или цифровой книгой, или просто большой текст (аналог MEMO ). Пример определения поля:

CREATE TABLE Table_BLOB(
   Kol_BLOB BLOB)

Поля BLOB несколько отличаются по способу хранения данных от других типов данных. Все остальные поля записи хранятся на одной странице рядом, одно за другим. Поле BLOB сохраняет на этой странице только идентификатор записи, а сама запись хранится на отдельной странице (страницах). Таким образом, оказалось возможным хранить данные большого размера, не ухудшая в целом работу всей БД.

У этого типа есть возможность указывать явно подтип: целое число, определяющее тип хранимых в поле данных. По умолчанию, 0 указывает на двоичные данные и 1 указывает на ASCII - текст. Программист может указывать собственные типы, используя отрицательные значения. Подтип указывается оператором SUB_TYPE:

CREATE TABLE Table_BLOB2(
   Kol_BLOB BLOB SUB_TYPE -1)

Однако заметим, что эта возможность InterBase практически не используется программистами.

Столбцы - массивы

В InterBase столбец любого типа, кроме BLOB, может быть объявлен, как массив. Такие столбцы, вместо единичного значения записи, содержат массив значений одинакового типа. Доступ к каждому значению возможен с помощью указания индекса. По умолчанию, нумерация элементов массива начинается с 1, однако программист может явно указать границы элементов:

CREATE TABLE ARRAY_TABLE(
    ARRAY1 INTEGER [10],
    ARRAY2 FLOAT [0:10, 5:10]);

В этом примере была объявлена таблица из двух столбцов-массивов. В первом случае объявлен массив целых чисел с диапазоном от 1 до 10 элементов, во втором случае объявлен двухмерный массив вещественных чисел с указанными программистом границами элементов. Это эквивалентно объявлению в Delphi двух переменных-массивов:

Var
  Array1 [1..10] of Integer;
  Array2 [0..10, 5..10] of Float;

Однако стандарт SQL -92, поддерживаемый InterBase, не поддерживает столбцов-массивов, поэтому доступ к отдельным значениям возможен только с помощью низкоуровневых функций API InterBase. Практически же такие столбцы используют крайне редко, ведь проще объявить, например, три поля с целыми числами, чем одно целое поле-массив, имеющее три элемента. В этом курсе мы не будем рассматривать работу полей-массивов, однако знать о существовании такого типа нужно. Любителям выбирать путь посложней, рекомендуем обратиться к справочнику и технической документации InterBase.

Логический тип

Как уже говорилось выше, в InterBase не поддерживаются типы Boolean. Вместо этого предлагается использовать тип CHAR(1), который создает односимвольный столбец, и вводить значения типа T/F, Y/N, Д/Н, 1/0, +/- и т.п. Проверка логики и правильности ввода значения возлагается на клиентское приложение.

Домены

Доменом в InterBase называется заранее созданное описание столбца, которое хранится отдельно от таблиц. Зачем это нужно? Предположим, планируемая база данных будет содержать десятки таблиц. Предположим далее, что во многих из этих таблиц потребуются поля с фамилией, именем и отчеством каких то людей. Можно было бы описать эти поля обычным образом, например (следующий запрос вводить в Interactive SQL не нужно):

CREATE TABLE Table_Firma(
   Familiya VARCHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
   Imya VARCHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
   Otchestvo VARCHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL)

Но обратите внимание на то, что нам пришлось много раз повторить одно и то же описание типа поля. А если такой же тип будет содержаться и в других таблицах? Гораздо предпочтительней создать домен, который затем и указывать при описании поля. Домен создается таким образом:

CREATE DOMAIN FIO AS VARCHAR(20) CHARACTER 
SET WIN1251 COLLATE PXW_CYRL

Выполните последний запрос в Interactive SQL, затем в дереве серверов утилиты IBConsole выделите раздел Domains и вы увидите созданный нами домен. Теперь создание таблицы Table_Firma существенно упростится:

CREATE TABLE Table_Firma(
   Familiya FIO,
   Imya FIO,
   Otchestvo FIO)

Этот же домен можно использовать в описании полей любой таблицы в пределах текущей базы данных.

< Лекция 15 || Лекция 16: 12 || Лекция 17 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Назерке Сейтсаданова
Назерке Сейтсаданова
Казахстан, Усть-Каменагорск, ВКГУ им. С.Аманжолова
Наталья Статченко
Наталья Статченко
Россия, Благовещенск