Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Типы данных

Работа с таблицами

Поддерживаемые типы данных

Данные, хранимые в записях таблицы, могут иметь различные типы. Для хранения символьной информации предназначены поля типа массив символов (CHAR). Длина символьного поля может быть от 1 до 65517 символов. Символьные поля сжимаются при хранении за счет удаления концевых пробелов и нулевых символов.

Для хранения информации произвольного назначения (например, графических образов) предназначены поля типа массив байтов (ARRA). Длина такого поля может быть от 1 до 65517 байтов. Поля этого типа не сжимаются и хранятся "как есть".

Упомянутые выше два типа полей могут быть объявлены ключевыми, если их длина не превышает 255 байтов.

Для хранения цифровой информации имеются поля следующих типов (хранятся в виде машинного представления соответствующих чисел):

BYTE небольшие целые числа без знака
INTR целые числа со знаком
WORD целые числа без знака
DATE для хранения даты
NMBR средние целые числа без знака
LONG длинные целые числа со знаком
DWRD длинные целые числа без знака
FLOA действительные числа
CURR длинные действительные (для хранения денежных единиц)
DFLT длинные действительные числа

Все поля, которые могут быть объявлены ключами, (цифровые и массивы символов/байтов короче 255) имеют одно резервированное значение (т.н. "запрещенное" значение). Поле не должно принимать такого значения. В полях типа массив байтов только последний байт массива не должен принимать "запрещенного" значения. В полях типа массив символов, наоборот, только первый байт массива не должен принимать "запрещенного" значения.

Запрещенное значение поля зарезервировано для использования в качестве NULL-значения (см.раздел Работа с Индексами).

Типы полей, их возможная длина, допустимые и запрещенные значения приведены в таблице.

Тип Длина Возможные значения Запрещ.значение
ARRA 1-65517 0 : 254 255(*)
CHAR 1-65517 1 : 254(x) 255(x), 0(**)
CURR 8 1.7E-308 : 1.7E+308 +NAN/-NAN,-0(***)
BYTE 1 0 : 254 255
DATE 2 1 : 65379 65535
DFLT 8 1.7E-308 : 1.7E+308 +NAN/-NAN,-0(***)
DWRD 4 0 : 4294967294 4294967295
FLOA 4 3.4E-38 : 3.4E+38 +NAN/-NAN,-0(***)
INTR 2 -32767 : +32767 -32768
LONG 4 -2147483647 : +2147483647 -2147483648
NMBR 3 0 : 16777214 16777215
WORD 2 0 : 65534 65535

x Запрещенное значение для символьных полей зависит от кодировки для ANSI-таблиц (Windows) это символ с кодом 160, для прочих таблиц - символ с кодом 255.

* Запрещенное значение недопустимо только для коротких символьных полей и полей типа массив байтов (длиной до 255), длинные поля могут иметь любые значения.

** Символ с кодом 0 используется как терминатор при сжатии данных символьного поля, поэтому не должен содержаться в середине символьного поля, иначе вся расположенная за ним информацию будет проигнорирована.

*** NAN (Not A Number) - комбинация битов, не являющаяся числом (порядок максимален, а мантисса не равна 0). Запрещенным значением является -0 (порядок и мантисса равны 0, знак меньше нуля).

Структура записи таблицы

Данные, хранимые в таблицах, сгруппированы по записям. Каждая запись содержит данные соответствующих полей в порядке их описания. Число байтов, отводимых для хранения данных поля, определяется его типом. Таким образом, запись можно представить в виде структуры языка Си, где порядок следования элементов структуры и их типы совпадают с описанием полей записи. Например, пусть запись таблицы описана так:

 string  CHAR 10
 array   ARRA 20
 shorty  BYTE 1
 integer INTR 2
 word    WORD 2
 special NMBR 3
 real    FLOA 4

Тогда запись можно представить в виде структуры (в предположении, что char определены как unsigned char):

 struct tagRECORD {
     char string[10];
     char array [20];
     char shorty;
     int integer;
     unsigned word;
     char special[3];
     float real;
 } RECORD;

Для обращения к данным поля записи можно использовать обращение к соответствующему элементу структуры. Длина поля записи определяется как sizeof() от поля структуры. Если структура записи не известна на момент компиляции программы, то для обращения к данным можно использовать явное преобразование типов (cast) или операции копирования памяти. Например, для описанной выше записи, на тело которой имеется ссылка типа void far*, можно сделать так:

 int integer;
 char array[20];
 void far *fpRecord; /* Указатель на тело записи */
 . . .
 integer = *(int far*) ((char far*)fpRecord + 30);
 memcpy( array, (char far*)fpRecord + 10, 20 );

Характеристики каждого элемента записи (длина, смещение в записи, тип и пр.) можно получить при помощи функций htTableElement() и htTableElementList()

Символьные данные, хранимые в постоянной части таблицы, сжимаются за счет концевых пробелов и символов '\0'. При выборке записей и операциях сравнения символьные поля "расжимаются". При этом они дополняются до заданной длины всегда пробелами.

При занесении данных в переменную часть (добавление или модификация записей) символьные поля нормализуются. При этом все символы массива, начиная с символа '\0' заменяются на пробелы. Такой подход позволяет унифицировать представление данных в постоянной и переменной частях.

Для установки значений всех полей в "пустое" состояние предназначена функция htNullRecord. Эта функция устанавливает значения цифровых полей в 0, символьные поля заполняет пробелами,

массивы байтов - нулями. Поля, имеющие NULL-значения, принимают соответствующее типу значение.