Структура EXTERNAL файлов

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Slavan
Сообщения: 7
Зарегистрирован: 14 авг 2006, 21:02

Структура EXTERNAL файлов

Сообщение Slavan » 11 дек 2009, 16:00

Создаю EXTERNAL файлы для INTERBASE 2007 и проблема возникает с числовыми типами, например SMALLINT. Почему-то в одном случае это 2 байта в другом 3 (первый нулевой а потом 2 байта данных). Может кто подскажет что к чему?
Например в таблице :

Код: Выделить всё

CREATE TABLE FIRMLIST_MS EXTERNAL 'FIRMLIST_MS.DAT' (
    ID        CHAR(9),
    DESCR     CHAR(25),
    NAME      CHAR(240),
    TELEFON   CHAR(50),
    ADDRESS   CHAR(240),
    DIRECTOR  CHAR(40),
    GLBUH     CHAR(40),
    INN       CHAR(20),
    ENVD      SMALLINT,
    USN       SMALLINT
);
ENVD и USN занимают по 2 байта
а в таблице

Код: Выделить всё

CREATE TABLE PRODLIST_MS EXTERNAL 'PRODLIST_MS.DAT' (
    ID        CHAR(9),
    CODE      CHAR(10),
    DESCR     CHAR(100),
    ISFOLDER  SMALLINT,
    PARENTID  CHAR(9),
    VALUCH    CHAR(9),
    MAXDISC   NUMERIC(15,4),
    FIRMCODE  CHAR(30),
    FIRMNAME  CHAR(9),
    COUNTRY   CHAR(30),
    MNFNAME   CHAR(9),
    NAME      CHAR(100),
    ARTID     INTEGER,
    TYPECODE  INTEGER,
    MNFID     INTEGER
);
ISFOLDER - 3 байта :?:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Структура EXTERNAL файлов

Сообщение kdv » 11 дек 2009, 17:36

подозреваю выравнивание.

Slavan
Сообщения: 7
Зарегистрирован: 14 авг 2006, 21:02

Re: Структура EXTERNAL файлов

Сообщение Slavan » 11 дек 2009, 20:45

kdv писал(а):подозреваю выравнивание.
спасибо, да, действительно методом "тыка" выяснил, что при добавлении данных числового поля в EXTERNAL файл, необходимо скорректировать размер записи с начала нулевыми байтами, кратно ... SMALLINT - 2, INTEGER, NUMERIC(15,4) - 4, другие типы данных не проверял ...
Например если есть таблица :
CREATE TABLE test EXTERNAL 'test.dat' (
CODE CHAR(1),
DESCR CHAR(4),
VAL SMALLINT(размер 2 байта) или INTEGER(размер 4 байта) или NUMERIC(15,4)(размер 8 байт)
);
тогда code и descr пишутся как есть (5 байт), а при добавлении значения val при SMALLINT пишется один нулевой байт, плюс 2 байта val (всего 8 байт), при INTEGER пишется три нулевых байта, плюс 4 байта val (всего 12 байт), при NUMERIC(15,4) пишется три нулевых байта, плюс 8 байт val (всего 16 байт)

Ответить