ЗАМЕЧАНИЕ.
То, что для "персональных" БД типа Paradox и dBase принято называть полями записи (fields), для InterBase, как и иных "промышленных" БД, работающих с SQL, принято называть столбцами (columns). Далее будем следовать этой устоявшейся традиции.В ТБД
InterBase могут использоваться столбцы следующих типов:
Тип столбца |
Размер, байт |
Описание |
SMALLINT |
2 |
Целочисленные значения от -32768 до +32767. |
INTEGER |
4 |
Целочисленные значения от -2 147 483 647 до +2 147 483 647. |
FLOAT |
4 |
Значения с плавающей точкой до 7 знаков от 3.4Е-38 до 3.4Е+38. |
DOUBLE PRECISION |
8 |
Значения с плавающей точкой до 15 знаков от1,7Е-308до1,7Е+308. |
CHAR(n) илиCHARACTER |
0-32767 |
Символьный столбец длиной в п символов. |
VARCHAR(n) или CHARACTER] VARYING |
0-32767 |
Символьный столбец переменной длины, содержащий до п символов. |
DATE |
8 |
Дата в пределах от 01.01.0100 до 11.12.5941. Также может хранить сведения о времени. |
BLOB |
переменный |
Любой тип двоичных данных. |
Столбцы могут определяться в следующих SQL-операторах:
• CREATE TABLE
- создать таблицу БД;• CREATE DOMAIN -
создать домен;• ALTER TABLE
- изменить структуру таблицы БД.Синтаксис определения столбцов:
<тип_данных>
= {{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION} [<размерность_массива>]
| {DECIMAL | NUMERIC
) [(точность [, масштаб])] [<размерность_массива>]| DATE
[<размерность_массива>]| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}
[(целое)] [<размерность_массива>] [CHARACTER SET набор_символов]
| {NCHAR I NATIONAL CHARACTER | NATIONAL CHAR}
[VARYING
] [(целое)] [<размерность_массива>]| BLOB [SUB_TYPE
{целое | имя_подтипа}] [SEGMENT SIZE целое][CHARACTER SET
набор_символов] | BLOB [(длина_сегмента [, подтип])]}
Столбец типа
SMALLINT хранит целочисленные значения в диапазоне от -32768..+32767. При определении структуры таблицы БД в Database Desktop этот тип называется SHORT.Столбец типа
INTEGER хранит целочисленные значения в диапазоне от -2 147 483 647 до +2 147 483 647. При определении структуру таблицы БД в Database Desktop этот тип называется LONG.Формат определения целочисленных столбцов:
<тип_данных> = {
SMALLINT | INTEGER} [<размерность_массива>]20.3. Значения с плавающей запятой
Столбец типа
FLOA Т хранит значения с плавающей запятой длиной до 7 знаков в диапазоне от 3,4Е-38 до 3,4Е+38.Столбец типа DOUBLE PRECISION хранит значения с плавающей запятой длиной до 15 знаков в диапазоне от 1,7Е-308 до 1.7Е+308.
Управлять числом знаков в дробной части числа с плавающей запятой нельзя, то есть нельзя при определении столбца БД указать фиксированное число знаков после запятой. В один и тот же столбец ТБД типа FLOAT или DOUBLE PRECISION можно поместить значения и "222.3333", и "22.33". Однако в приложении на значения таких полей можно наложить маску с точным числом знаков после запятой. Например, наложение маски '#,###.00' приведет к тому, что будут показываться только два знака после запятой. Если значение столбца имеет в дробной части более знаков, чем указано в маске, они будут округляться. Значение 100.678 в этом случае будет округлено как 100.68. Если в дробной части значения столбца меньше знаков, чем указано в маске, недостающие разряды будут дополняться нулями. Так, значение 100.2 будет показано как 100.20.
Значения указанных типов следует применять в столбцах, где число знаков в дробной части при хранении значений несущественно и где может понадобиться большая точность представляемых вещественных значений, например, до 7 (FLOAT) или до 15 (DOUBLE PRICISION) знаков после запятой.
При попытке представления числа с большим числом разрядов, чем это разрешено типом данных, хранимые данные округляются до последней значащей цифры в разрешенном разряде. Например, попытка записать в столбец типа FLOAT значение " 123.456789" приведет к запоминанию значения "123.4568".
Формат определения целочисленных значений:
<тип_данных> = {FLOAT DOUBLE PRECISION} [<размерность_массива >]
20.4. Фиксированно-десятичные значения
Типы
DECIMAL и NUMERIC задают значения с плавающей запятой и определяют в них фиксированное число знаков после запятой. Формат определения этих типов<тип_данных> ={
DECIMAL | NUMERIC} [(точность [, масштаб])] [<размерность массива >]где точность определяет число знаков в хранимом числе (максимум 15), а масштаб - число знаков после десятичной точки и может быть равен нулю. Во всех случаях масштаб должен быть меньше точности.
ВНИМАНИЕ! Специальных столбцов типа
DECIMAL и NUMERIC физически не существует; вместо этого, столбцы, описанные типами DECIMAL и NUMERIC, хранятся как INTEGER или DOUBLE PRECISION.При этом действует правило: если точность (число знаков в числе) меньше 10, то реальный тип столбца
INTEGER; если точность больше или равно 10, реальный тип столбца DOUBLE PRECISION. Например:
Объявление |
Реальный тип столбца |
DECIMAL(5,2) |
INTEGER |
DECIMAL(12,2) |
DOUBLE PRECISION |
DECIMAL(12,0) |
DOUBLE PRECISION |
Известно, что в столбцах типа
INTEGER дробных значений хранить нельзя. Поэтому, независимо от того, указано число знаков после десятичной точки или нет, объявление DECIMAL и NUMERIC с общим числом разрядов, меньшим 10, приведет к тому, что фактически в столбце можно будет хранить только целочисленные значения.Пример. Определим в ТБД 4 столбца с типами
DECIMAL(5,2), DECI-MAL(12,2), DECIMAL(5,0), DECIMAL(12,0) и присвоим им всем одно и то же значение 123.4567. Результат:
DECIMAL(5,2) |
DECIMAL (12,2) |
DECIMAL(5,0) |
DECIMAL(12,0) |
123 |
123.4567 |
123 |
123.4567 |
Как можно заметить, действительно существенным в объявлении типов
DECIMAL и NUMERIC является общее число разрядов в числе (точность);число знаков после десятичной точки (масштаб) существенного значения не имеет.
Столбцы типа DATE позволяют хранить значения даты в пределах от 01.01.0100 до 11.12.5941, а также, вместе с датой - и значения времени. Формат объявления:<тип_данных> =
DATE [<размерность_массива >]Формат столбца типа
DATE InterBase полностью совместим с типом TDateTime, объявленном в Delphi. Этот тип позволяет одновременно хранить в одной переменной дату и время.Если ввод данных в столбец типа
DATE производится из утилиты WISQL, значения даты должны указываться в формате InterBase. Согласно этому формату, значения даты состоят из номера дня (01-31), месяца (JAN-DEC) и года. Эти значения отделяются разделителями. Стандартным разделителем является символ '-', но принимаются и пробел ' ', правый слеш '/', точка '.'. Значения дат в InterBase должны лежать в диапазоне "1-JAN-100".." 11-DEC-5941".Пример.
Запишем в столбец DATAP типа DATE результат выполнения функции Now, определенной в Delphi (Now возвращает текущие время и дату, установленные на компьютере). Затем в Label I.Caption поместим дату, а в Label2.Caption - время из столбца DATAP:WITH Table1 do begin
Insert;
FieldByName('DATAP').Value := Now; //
дата прихода товараFieldByName('TOVAR').Value : '
Брус'; // товарFieldByName('Kolvo').Value :- 10; //
количествоPost;
Labell.Caption := DateToStr(Fields[0].Value);
Label2.Caption := TimeToStr(Fields[0].Value);
END;//with
Результат выполнения кода приведен на рис. 20.1.
Интерпретация формата представления значений типа даты зависит от настроек - программных или операционной системы компьютера. Рекомендую всякий раз при старте приложения программно переустанавливать формат даты к привычному нам российскому формату:
procedure TForm1.FormCreate(Sender: TObject) ;
begin
DateSeparator := '.';
ShortDateFormat := 'dd.mrn. yyyy' ;
ShortTimeFormat := 'hh:mm:ss';
end;
Таким образом можно игнорировать неопределенность текущих установок операционной системы на конкретном компьютере.
ЗАМЕЧАНИЕ. В
InterBase значения типа даты совместимы с рассматриваемыми ниже строковыми типами. Поэтому, если в SQL-операторах InterBase необходимо интерпретировать значения типа даты в строку, нет необходимости в приведении типов, например, можно так записать в символьное поле S1 значение типа даты (NOW возвращает текущие дату и время):UPDATE SOMETABLE
SET S1 = "
Дата отгрузки" || NOW) ;Кроме того, присвоение значения полям типа дата также производится в символьном формате:
INSERT INTO SOMETABLE (DATA_PRIHODA, KOLVO)
VALUES("01-FEB-1997",100) ;
Столбцы типа
CHAR(n) и VARCHAR(n) позволяют хранить строковые значения длиной до n символов. В любом случае n не может превышать 32 Кб.Различие типов
CHAR(n) и VARCHAR(n) документация по InterBase определяет так:• CHAR(n)
определяет строковые столбцы фиксированной длины. Определение "фиксированная длина" означает, что даже если в столбец записано меньше п символов, незаполненное пространство заполняется пробелами. При хранении хвостовые пробелы усекаются, что позволяет хранить действительно значащее содержимое столбцов типа CHAR(n) и сближает их со строками переменной длины. При чтении значения столбца хвостовые пробелы вставляются в столбец снова (см. замечание ниже). Такой механизм придуман для экономии дискового пространства, когда действительная длина значений данного столбца в различных записях варьируется достаточно широко.• VARCHAR(n)
определяет строковые столбцы переменной длины. Определение "переменная длина" означает, что в записи хранится ровно столько символов, сколько их имеется в значении столбца. Например, если для VARCHAR(lOO) значения столбцов для одной записи -"Петров", а для другой - "Барабанов", в первом случае хранится 6 символов, а во втором - 9.Столбцы
VARCHAR(n) позволяют экономить дисковое пространство, давая возможность серверу располагать больше записей на странице БД. Это увеличивает число операций ввода-вывода, возможных для одной страницы. К недостаткам относится то, что VARCHAR(n) читаются медленнее, чем CHAR(n).Попытка записать в столбец более чем п символов приведет к усечению лишних символов.
ЗАМЕЧАНИЕ. Опытным путем нетрудно убедиться в том, что
Delphi при работе с InterBase интерпретирует столбцы типа CHAR(n) и VARCHAR(n) как TStringField. При этом:• столбцы типа
CHAR(n) всегда читаются без хвостовых пробелов;• при занесении хвостовых пробелов в столбец (а часто это бывает необходимо)
CHAR(n) всегда усекает их, в то время как VARCHAR(n), наоборот, всегда их хранит.Формат определения символьных столбцов:
<
тип_данных> = {CHAR CHARACTER CHARACTER VARYING I VARCHAR} [ (n)] [<размерность_массива >] [CHARACTER SET набор_символов]где
n определяет длину символьного столбца. Если n опущено, по умолчанию подразумевается 1.CHARACTER SET
позволяет установить кодировку путем указания имени используемого набора символов. Если CHARACTER SET опущен, используется кодировка, принятая по умолчанию для БД (устанавливается в предложение DEFAULT CHARACTER SET оператора CREATE DATABASE). Рекомендуется явно указывать CHARACTER SET целиком для таблицы, базы данных или, если в таблице наборы символов различны для разных столбцов, - для каждого конкретного столбца.Если определен набор символов, то в столбец невозможно ввести символы, не входящие в данную таблицу кодировки.
Для представления столбцов, которые будут содержать русскоязычные тексты, рекомендуем использовать набор символов
WIN1251, например:SYMPOLE CHARACTER(20) CHARACTER SET WIN1251;
Если при создании БД был принят набор символов по умолчанию, для чего в оператор
CREATE DATABASE добавлено предложение DEFAULT CHARACTER SET, то этот набор символов будет принят по умолчанию для всех столбцов. Например:CREATE DATABASE BAZA ...DEFAULT CHARACTER SET WIN1251;
При определении столбца набор символов, принятый для БД по умолчанию, можно переопределить. Для этого и служит предложение
CHARACTER SET в определении столбца. Если при объявлении столбца предложение CHARACTER SET опущено, используется набор символов, принятый по умолчанию для всей БД при ее создании. Если при создании БД набор символов по умолчанию не был определен, т.е. предложение DEFAULT CHARACTER SET отсутствовало в операторе CREATE DATABASE, по умолчанию принимается набор символов NONE. Он позволяет вводить в символьные столбцы символы любых кодировок. Данные хранятся так, как они вводятся. Однако для столбцов с набором символов NONE могут возникнуть проблемы при записи их значения в столбцы, которым набор символов явно назначен.Порядок сортировки символов
Порядок сортировки символов определяет порядок перечисления символов для набора символов. Например, порядок сортировки
PXW_CYRL для кириллического набора символа WIN1251 определяет порядок следования символов 'А','Б','В',Г',...'Я'. Известно, что для символьных значений сравнение производится по правилу: меньшим считается символ, определенный в наборе символов раньше. То есть, в нашем случае, 'А' < 'Б' и 'Анискин' меньше, чем 'Артюхин', а 'Артюхин' меньше, чем 'Бармалеев' и 'Якушев'.Порядок сортировки символов определяет, таким образом, принцип, по которому символьные значения будут сравниваться и сортироваться в операторах
SELECT (если в нем присутствуют разделы WHERE, GROUP BY), при обновлении индексов и т.д.Порядок сортировки символов определяется предложением
COLLATE <collation order>
где
collation order определяет имя порядок сортировки.Для кириллического набора символов WIN1251 рекомендуется порядок сортировки
PXW_CYRL. Например:SYMPOLE CHARACTER (20) CHARACTER SET WIN12151 COLLATE PXW_CYRL;
BLOBВ столбцах типа
BLOB хранят данные, которые невозможно хранить в столбцах других типов. BLOB (binary large object,- большой двоичный объект) имеет переменную длину и понимается как последовательность байтов, т.е. нетипизированное, с точки зрения хранения информации, поле данных В BLOB-столбцах можно хранить графические образы, тексты большой длины, звуковые файлы, видеоизображения, мультимедиа-информацию В BLOB-столбцах также можно хранить указатели на неструктурированные файлы информации, которые расположены в ином, фиксированном месте При этом интерпретация содержимого BLOB-столбца может ложиться не только на клиентскую часть, т е. на прикладное программное обеспечение, но также и на сервер В последнем случае в серверной БД могут быть определены так называемые BLOB-фильтры, определяющие способы преобразования BLOB-значений от одного вида к другому В качестве одной из задач, могущих обусловить необходимость определения пользовательского фильтра BLOB, можно назвать преобразование изображений из одного графического формата в другойВ отличие от "персональных" (или "локальных") СУБД типа
Paradox, InterBase хранит значения BLOB-столбцов не в отдельных файлах, а в самой БД. Он хранит их в виде сегментов. Одна операция ввода-вывода при доступе к BLOB-информации оперирует с одним сегментом В самой таблице БД, если в ней объявлен столбец типа BLOB, хранится указатель на начальный сегмент BLOB-столбца в области хранения BLOB-информации этой БД. Указатель на BLOB представляет собой уникальное целочисленное значение и формируется автоматическиДлина сегмента
BLOB не влияет на производительность InterBase Однако, исходя из некоторых соображений, ее можно определять явно при создании BLOB-столбцаBLOBPOLE BLOB SEGMENT SIZE 1024, ...
По умолчанию длина сегмента 80; максимальная длина сегмента 32 Кбайт (32 767 байт).
Для столбца типа
BLOB может быть указан подтип, определяющий, какой тип данных будет записан в этот столбец Подтип есть число. Позитивные значения зарезервированы InterBase. О (по умолчанию) для указания двоичных данных и 1 для указания ASCII-текстов Отрицательные значения могут использоваться программистами для определения собственных подтипов В общем случае указание подтипа производится через опцию SUB_TYPE<
имя столбца> BLOB SUB_TYPE 1 CHARACTER SET WIN1251 ...Однако
InterBase автоматически не отслеживает правильность занесения информации в столбцы типа BLOB. Это необходимо делать в приложениях.20.8. Совместимость типов столбцов
При выполнении операций над столбцами следует помнить, что операции могут выполняться только над столбцами совместимых типов В случае невыполнения этого требования
InterBase пытается автоматически привести типы таким образом, чтобы значения, участвующие в операции, принадлежали совместимым типам. Кроме того, для ручного приведения типов можно использовать функцию CAST, которая приводит типы внутри оператора SELECT, обычно в предложении WHERECAST (<
значение> I NULL AS ТипДанных}CAST может преобразовать исходные типы данных в результирующие типы
Исходные типы данных Результирующие типы данных
DATE CHAR
или NUMERICchar DATE
или NUMERICNUMERIC DATE
или CHARНапример,
привести значение Datal (тип DATE) к типу CHAR и сравнить его со значением Date2 (типа CHAR)SELECT .....
WHERE DATE2 <= CAST (DATE1 AS CHAR);