Структура DBF-файла

Табл. 1. Структура файла DBF.

Длина Назначение
32 Заголовок файла DBF. См. табл 2.
n*m Дескрипторы полей в количестве n. Для dBASE 7 m=48 (см. табл 6), для предшествующих версий структуры заголовка m=32 (см. табл 5).
1 Терминальный байт CHR(13).
  Только в dBASE 7. Необязательные свойства полей. См. "Data File Header Structure for the dBASE Version 7 Table File".
m*k Записи с данными (длиной k и количеством m). См. табл 8.


Табл. 2. Заголовок файла DBF.

Адрес Длина Назначение
0 0x00 1 Сигнатура. См. табл 3 и табл 4.
1 0x01 3 Дата последней модификации в виде ГГММДД
4 0x04 4 Число записей в базе
8 0x08 2 Полная длина заголовка (с дескрипторами полей)
10 0x0A 2 Длина одной записи
12 0x0C 2 Зарезервировано (всегда 0)
14 0x0E 1 Флаг, указывающий на наличие незавершенной транзакции dBASE IV
15 0x0F 1 Флаг шифрования таблицы dBASE IV
16 0x10 12 Зарезервированная область для многопользовательского использования
28 0x1C 1 Флаг наличия индексного MDX-файла
29 0x1D 1 Идентификатор кодовой страницы файла (dBASE IV, Visual FoxPro, XBase). См. табл 9.
30 0x1E 2 Зарезервировано (всегда 0)
32 0x20 32 Только в dBASE 7. Идентификатор языкового драйвера. См. табл 10.
64 0x40 4 Только в dBASE 7. Зарезервировано


Табл. 3. Сигнатура.

Биты Описание
0-2 Номер версии: 3 для dBASE III, dBASE IV, dBASE V, 4 для dBASE 7. Прочие СУБД это правило соблюдают не всегда
3 В сочетании с битом 7 - флаг наличия MEMO-файла dBASE IV или dBASE for Windows
4 Зарезервировано для SQL-таблиц
5-6 Флаги dBASE IV SQL-таблицы
7 Наличие любого .DBT MEMO-файла (MEMO-файл таблицы dBASE III Plus, dBASE IV или dBASE под Windows)


Табл. 4. Известные сигнатуры.

Сигнатура СУБД Описание
2 0x02 00000010 FoxBASE Таблица без memo-полей
3 0x03 00000011 dBASE III, dBASE IV, dBASE 5, dBASE 7, FoxPro, FoxBASE+ Таблица без memo-полей
4 0x04 00000100 dBASE 7 Таблица без memo-полей
48 0x30 00110000 Visual FoxPro Таблица (признак наличия memo-поля .FPT не предусмотрен )
49 0x31 00110001 Visual FoxPro Таблица с автоинкрементными полями
67 0x43 01000011 dBASE IV, dBASE 5 SQL-таблица dBASE IV без memo-полей
99 0x63 01100011 dBASE IV, dBASE 5 Системная SQL-таблица dBASE IV без memo-полей
131 0x83 10000011 dBASE III, FoxBASE+, FoxPro Таблица с memo-полями .DBT
139 0x8B 10001011 dBASE IV, dBASE 5 Таблица с memo-полями .DBT формата dBASE IV
140 0x8C 10001100 dBASE 7 Таблица с memo-полями .DBT формата dBASE IV
203 0xCB 11001011 dBASE IV, dBASE 5 SQL-таблица dBASE IV с memo-полями .DBT
203 0xE5 11100101 SMT Таблица с memo-полями .SMT
235 0xEB 11101011 dBASE IV, dBASE 5 Системная SQL-таблица dBASE IV с memo-полями .DBT
245 0xF5 11110101 FoxPro Таблица с memo-полями .FPT
251 0xFB 11111011 FoxBASE Таблица с memo-полями .???
* Желтым выделены сигнатуры, не соответствующие табл 3.


Табл. 5. Дескриптор поля (кроме dBASE 7).

Адрес Длина Назначение
0 0x00 11 Имя поля
11 0x0B 1 Тип поля. См. табл 7
12 0x0C 4 Зарезервировано
16 0x10 1 Полная длина поля
17 0x11 1 Число десятичных разрядов; для типа C - второй байт длины поля
30 0x1E 13 Зарезервировано (всегда 0)
31 0x1F 1 Флаг тэга файла MDX (только в dBASE IV)


Табл.6. Дескриптор поля в dBASE 7.

Адрес Длина Назначение
0 0x00 32 Имя поля
32 0x20 1 Тип поля. См. табл 7
33 0x21 1 Полная длина поля
34 0x22 1 Число десятичных разрядов; для типа C - второй байт длины поля
35 0x23 2 Зарезервировано
37 0x25 1 Флаг тэга файла MDX: 1 для индексированного поля, 0 - для неиндексированного
38 0x26 2 Зарезервировано
40 0x28 4 Для автоинкрементного поля - следующее значение, для прочих полей - 0
44 0x2C 4 Зарезервировано


Табл. 7. Типы полей.

Символ типа Имя типа Когда появился Формат хранения
B Binary dBASE 5 Номер блока в MEMO-файле, хранимый в виде строки до 10 цифр, выровненной вправо пробелами. Длина поля всегда 10. Пустое значение - 10 пробелов, означает отсутствие блока в MEMO-файле
Double MS Visual FoxPro Плавающее число, хранимое в 8-байтовом бинарном формате IEEE 754. Пустое значение совпадает с нулем
C Character dBASE III Строка, выровненная влево пробелами
D Date dBASE III Дата, хранимая в виде строки из 8 цифр в формате ГГГГММДД. Пустое значение - 10 пробелов
F Float dBASE IV Число, хранимое в виде строки заданной длины с заданным количеством цифр после точки, выровненной вправо пробелами. Пустое значение задается строкой пробелов. Чем отличается от Numeric, непонятно
G General (OLE) dBASE 5 Номер блока в MEMO-файле, хранимый в виде строки до 10 цифр, выровненной вправо пробелами. Длина поля всегда 10. Пустое значение - 10 пробелов, означает отсутствие блока в MEMO-файле
I Integer (Long) dBASE 7 Знаковое целое число, хранимое в бинарном виде. Длина поля - 4 байта, порядок байтов - big-endian, старший бит инвертирован относительно дополнительного кода. Преимущество такого формата хранения в том, что числа можно сравнивать побайтово, что очень полезно для индексирования. Пустое значение совпадает с нулем
L Logical dBASE III Булево значение, длина всегда 1. 'T', 't', 'Y', 'y' - истина, 'F', 'f', 'N', 'n' - ложь, пробел или '?' - пустое значение
M Memo dBASE III Номер блока в MEMO-файле, хранимый в виде строки до 10 цифр, выровненной вправо пробелами. Длина поля всегда 10. Пустое значение - 10 пробелов, означает отсутствие блока в MEMO-файле
N Numeric dBASE III Число, хранимое в виде строки заданной длины с заданным количеством цифр после точки, выровненной вправо пробелами. Пустое значение задается строкой пробелов
O Double dBASE 7 Плавающее число, хранимое в 8-байтовом бинарном формате, получаемом из IEEE 754 простым преобразованием. Порядок байтов изменяется на обратный, для отрицательных чисел инвертируются все биты, для неотрицательных - только знаковый бит. Преимущество такого формата хранения в том, что числа можно сравнивать побайтово, что очень полезно для индексирования. Пустое значение совпадает с нулем
P Picture FoxPro Номер блока в MEMO-файле, хранимый в виде строки до 10 цифр, выровненной вправо пробелами. Длина поля всегда 10. Пустое значение - 10 пробелов, означает отсутствие блока в MEMO-файле
Q Varbinary MS Visual FoxPro Бинарные данные переменной длины. Начальная часть хранится в DBF-файле, хвост переменного размера - в memo-файле
T DateTime FoxPro Дата и время. Существует в двух вариантах: текстовом и бинарном. Текстовый вариант - строка из 14 цифр в формате ГГГГММДДЧЧММСС; пустое значение - 14 пробелов. Бинарный вариант - два двойных слова little-endian, т.е. всего 8 байт; первое двойное слово содержит число дней от начала Юлианского календаря (01.01.4713 до нашей эры), второе двойное слово - число миллисекунд от начала суток; пустое значение - 8 нулевых байтов
V Varchar MS Visual FoxPro Строка переменной длины. Начальная часть строки хранится в DBF-файле, хвост переменного размера - в memo-файле. Индексация - только по начальной части
W Blob MS Visual FoxPro Нет информации о формате
Y Currency MS Visual FoxPro Денежный тип. Хранится в виде знакового 8-байтового целого числа little-endian. Точность хранения составляет 1E-4 денежной единицы. Пустое значение совпадает с нулем
@ Timestamp (DateTime) dBASE 7 Дата и время. Совпадает с типом 'T' в бинарном варианте
+ Autoincrement dBASE 7 Знаковое целое число, хранимое в бинарном виде. Длина поля - 4 байта, порядок байтов - big-endian, старший бит инвертирован относительно дополнительного кода. Преимущество такого формата хранения в том, что числа можно сравнивать побайтово, что очень полезно для индексирования. Пустое значение совпадает с нулем
* Желтым выделены DBF-типы,  неподдерживаемые библиотекой DBF.


Табл. 8. Запись.

Длина Назначение
1 Заголовочный байт. Может принимать одно из следующих значений:
  • 0x20 (32) - обычная запись;
  • 0x2A (42) - удаленная запись
n Данные записи (количество данных n). Данные полей в порядке описания полей без разделителей.


Табл. 9. Идентификаторы кодовой страницы файла.

Идентификатор Кодовая страница Описание
1 0x01 437 US MS-DOS
2 0x02 850 International MS-DOS
3 0x03 1252 Windows ANSI Latin I
4 0x04 10000 Standard Macintosh
8 0x08 865 Danish OEM
9 0x09 437 Dutch OEM
10 0x0A 850 Dutch OEM*
11 0x0B 437 Finnish OEM
13 0x0D 437 French OEM
14 0x0E 850 French OEM*
15 0x0F 437 German OEM
16 0x10 850 German OEM*
17 0x11 437 Italian OEM
18 0x12 850 Italian OEM*
19 0x13 932 Japanese Shift-JIS
20 0x14 850 Spanish OEM*
21 0x15 437 Swedish OEM
22 0x16 850 Swedish OEM*
23 0x17 865 Norwegian OEM
24 0x18 437 Spanish OEM
25 0x19 437 English OEM (Great Britain)
26 0x1A 850 English OEM (Great Britain)*
27 0x1B 437 English OEM (US)
28 0x1C 863 French OEM (Canada)
29 0x1D 850 French OEM*
31 0x1F 852 Czech OEM
34 0x22 852 Hungarian OEM
35 0x23 852 Polish OEM
36 0x24 860 Portuguese OEM
37 0x25 850 Portuguese OEM*
38 0x26 866 Russian OEM
55 0x37 850 English OEM (US)*
64 0x40 852 Romanian OEM
77 0x4D 936 Chinese GBK (PRC)
78 0x4E 949 Korean (ANSI/OEM)
79 0x4F 950 Chinese Big5 (Taiwan)
80 0x50 874 Thai (ANSI/OEM)
87 0x57 Current ANSI CP ANSI
88 0x58 1252 Western European ANSI
89 0x59 1252 Spanish ANSI
100 0x64 852 Eastern European MS-DOS
101 0x65 866 Russian MS-DOS
102 0x66 865 Nordic MS-DOS
103 0x67 861 Icelandic MS-DOS
104 0x68 895 Kamenicky (Czech) MS-DOS
105 0x69 620 Mazovia (Polish) MS-DOS
106 0x6A 737 Greek MS-DOS (437G)
107 0x6B 857 Turkish MS-DOS
108 0x6C 863 French-Canadian MS-DOS
120 0x78 950 Taiwan Big 5
121 0x79 949 Hangul (Wansung)
122 0x7A 936 PRC GBK
123 0x7B 932 Japanese Shift-JIS
124 0x7C 874 Thai Windows/MS–DOS
134 0x86 737 Greek OEM
135 0x87 852 Slovenian OEM
136 0x88 857 Turkish OEM
150 0x96 10007 Russian Macintosh
151 0x97 10029 Eastern European Macintosh
152 0x98 10006 Greek Macintosh
200 0xC8 1250 Eastern European Windows
201 0xC9 1251 Russian Windows
202 0xCA 1254 Turkish Windows
203 0xCB 1253 Greek Windows
204 0xCC 1257 Baltic Windows
* - вторая (международная) кодовая страница


Табл.10. Идентификаторы языковых драйверов в dBASE 7.

Внутреннее имя  Полное имя  Набор символов
DBWINUS0 'ascii' ANSI Windows code page 1252
DBWINES0 'Spanish' ANSI Windows code page 1252
DBWINWE0 'WEurope' ANSI Windows code page 1252
DB936CN0 dBASE CHS cp936 DOS code page 936
DB852CZ0 dBASE CSY cp852 DOS code page 852
DB867CZ0 dBASE CSY cp867 DOS code page 867
DB865DA0 dBASE DAN cp865 DOS code page 865
DB437DE0 dBASE DEU cp437 DOS code page 437
DB850DE0 dBASE DEU cp850 DOS code page 850
db437gr0 dBASE ELL GR437 DOS code page 439
DB437UK0 dBASE ENG cp437 DOS code page 437
DB850UK0 dBASE ENG cp850 DOS code page 850
DB437US0 dBASE ENU cp437 DOS code page 437
DB850US0 dBASE ENU cp850 DOS code page 850
DB437ES1 dBASE ESP cp437 DOS code page 437
DB850ES0 dBASE ESP cp850 DOS code page 850
DB437FI0 dBASE FIN cp437  DOS code page 437
DB437FR0 dBASE FRA cp437 DOS code page 437
DB850FR0 dBASE FRA cp850 DOS code page 850
DB850CF0 dBASE FRC cp850 DOS code page 850
DB863CF1 dBASE FRC cp863 DOS code page 863
db852hdc dBASE HUN cp852 DOS code page 852
DB437IT0 dBASE ITA cp437 DOS code page 437
DB850IT1 dBASE ITA cp850 DOS code page 850
DB932JP1 dBASE JPN Dic932 DOS code page 932
DB932JP0 dBASE JPN cp932 DOS code page 932
DB949KO0 dBASE KOR cp949 DOS code page 949
DB437NL0 dBASE NLD cp437 DOS code page 437
DB850NL0 dBASE NLD cp850 DOS code page 850
DB865NO0 dBASE NOR cp865 DOS code page 865
db852po0 dBASE PLK cp852 DOS code page 852
DB850PT0 dBASE PTB cp850 DOS code page 850
DB860PT0 dBASE PTG cp860 DOS code page 860
db866ru0 dBASE RUS cp866 DOS code page 866
db852sl0 dBASE SLO cp852 DOS code page 852
DB437SV0 dBASE SVE cp437 DOS code page 437
DB850SV1 dBASE SVE cp850 DOS code page 850
DB950TW0 dBASE CHT cp950 DOS code page 950
db874th0 dBASE THA cp874 DOS code page 874
DB857TR0 dBASE TRK cp857 DOS code page 857
dbHebrew Hebrew dBASE DOS code page 862
Bgdb868 DBASE BUL 868 DOS code page 868