Форматы DBF: версии и чем они отличаются
«Файл DBF» — не один формат, а семейство. За сорок лет его расширяли dBase, FoxPro, Clipper и десятки программ поменьше, и каждая добавляла своё. Отсюда вечная история: файл есть, а программа говорит, что он повреждён.
Откуда столько версий
Формат появился в dBase II в начале 1980-х и оказался настолько удобным, что его подхватили конкуренты: FoxBASE и FoxPro, Clipper, позже сотни учётных программ. Общего стандарта не было никогда — каждый производитель расширял формат под свои нужды: новые типы полей, длинные имена, memo-файлы в собственной разметке, NULL-значения.
Основа при этом не менялась: заголовок, описания полей по 32 байта и записи одинаковой длины. Поэтому простую таблицу из дюжины текстовых и числовых полей понимают почти все программы, а сложности начинаются на расширениях. Побайтовая раскладка разобрана в справочнике по структуре DBF, здесь — чем версии отличаются друг от друга.
Основные версии
| Версия | Годы | Что добавила | Memo |
|---|---|---|---|
| dBase III / III+ | 1984–1986 | классическая основа: типы C, N, D, L, M, до 128 полей | .DBT, блоки по 512 байт |
| FoxBASE / FoxPro 2.x | 1987–1994 | совместимость с dBase III плюс свой формат memo и индексы .IDX и .CDX | .FPT с заданным размером блока |
| Clipper | 1985–1990-е | компилятор программ на языке dBase; таблицы в формате dBase III, индексы .NTX | .DBT, у драйвера SIX — .SMT |
| dBase IV / 5 | 1988–1994 | тип F (число с плавающей точкой), memo с заголовком блока | .DBT нового образца |
| Visual FoxPro | 1995–2007 | типы I, T, Y, B, V, Q; NULL-значения; автоинкремент; принадлежность к базе .DBC | .FPT, ссылка 4 байтами |
| dBase Level 7 | 1997 | имена полей до 32 символов, дескрипторы по 48 байт, автоинкремент | .DBT |
Как узнать версию файла
Версию хранит первый байт файла. Его видно в любом шестнадцатеричном просмотрщике, а редактор на этом сайте сразу называет диалект открытой таблицы.
| Байт | Что означает |
|---|---|
0x02 | FoxBASE |
0x03 | dBase III и совместимые, без memo — самый распространённый вариант |
0x04 | dBase IV или Level 7 без memo |
0x05 | dBase 5 без memo |
0x30, 0x31, 0x32 | Visual FoxPro: обычная таблица, с автоинкрементом, с полями переменной длины |
0x83 | dBase III с memo |
0x7B, 0x8B | dBase IV с memo |
0xE5 | Clipper с драйвером SIX, memo в .SMT |
0xF5, 0xFB | FoxPro 2.x с memo, FoxBASE |
Байт говорит о диалекте, но не обо всём. Наличие memo надёжнее проверять по фактическим полям типа M, а dBase Level 7 отличается от dBase IV не байтом, а длиной описаний полей.
Где версии расходятся
- Тип B. В Visual FoxPro это число двойной точности, в dBase — ссылка на двоичное memo. Программа, перепутавшая диалект, покажет вместо чисел мусор.
- Memo-ссылка. dBase и FoxPro 2.x пишут номер блока десятью цифрами, Visual FoxPro — четырьмя байтами. Отсюда пустые memo в «универсальных» просмотрщиках.
- NULL. Visual FoxPro хранит признак NULL в скрытом поле
_NullFlags. Без его разбора пустое значение неотличимо от нуля. - Длинные имена. У dBase Level 7 имя поля до 32 символов; программы для dBase III увидят сдвинутые поля или откажутся открывать файл.
- Кодировка. Байт языкового драйвера появился не сразу и заполнен далеко не всегда — отсюда кракозябры.
Какую версию выбрать для новой таблицы
Если файл готовится для чужой программы — ту, что указана в её требованиях, и никакую другую. Если требований нет, самый совместимый вариант — dBase III без memo: типы C, N, D и L, имена полей до десяти латинских символов, однобайтовая кодировка. Такой файл откроет любая программа, знающая DBF.
Visual FoxPro стоит выбирать, только когда нужны его типы — дата со временем, денежный тип, NULL — и получатель точно их понимает.
Частые вопросы
Чем отличается .dbf от .dbc?
DBF — отдельная таблица. DBC — контейнер базы данных Visual FoxPro: он хранит связи, длинные имена и правила для входящих в него таблиц, но сами данные остаются в .dbf.
Почему файл открывается в одной программе и не открывается в другой?
Чаще всего вторая программа не знает диалекта: например, ждёт dBase III, а получает таблицу Visual FoxPro с полями типа I или T.
Можно ли перевести таблицу из одной версии в другую?
Да, выгрузкой в DBF с нужной структурой. При этом типы, которых нет в целевой версии, придётся заменить — и важно, чтобы инструмент сообщил, что именно заменено.