Самоучитель по SQL-сервер в Linux



Приложение В. Двоичный формат команды COPY

Выходные данные команды COPY могут сохраняться не только в текстовом, но и в двоичном формате PostgreSQL. С файлами, сохраненными в двоичном формате, невозможно работать в обычных текстовых редакторах.

Заголовок

Заголовок двоичного файла PostgreSQL состоит из фиксированного набора полей общей длиной 24 байта и расширенного заголовка переменной длины. Ниже перечислены фиксированные поля заголовка.

  • Сигнатура. 12-байтовая последовательность символов PGBCOPY\n\377\r\n\0. Сигнатура используется для идентификации файлов, искаженных при пересылке. Она изменяется при потере значений NULL, нарушении контроля четности, воздействии фильтров преобразования новой строки и потере старших битов.
  • Определитель порядка байтов. 4-байтовая целочисленная константа (0x01020304), при помощи которой предотвращается перестановка байтов в процессе чтения двоичных файлов.
  • Флаги. 4-байтовое целое число, содержащее информацию о формате файла. Поле состоит из набора флагов, а его биты нумеруются с 0 (младший бит) до 31 (старший бит). Для сохранения совместимости биты 0-15 зарезервированы, а в битах 16-31 хранятся флаги. В PostgreSQL 7.1.x определен только бит 16:
    • если бит 16 равен 1, в файле сохраняются идентификаторы объектов; о если бит 16 равен 0, идентификаторы объектов в файл не включаются.
  • Поле длины расширенного заголовка. 4-битовое целое поле, содержащее длину оставшейся части заголовка в байтах (без учета длины самого поля). В предыдущих версиях это поле было равно 0, и за ним непосредственно следовали данные первой записи.

Записи

Записи в двоичном файле начинаются с 16-разрядного целого количества полей (одинакового для каждой записи). Затем следует 16-разрядное целое поле typlen, после чего — поля данных. Допустимые значения поля typlen перечислены ниже.

  • 0. NULL; поле не содержит данных.
  • >0. Тип данных фиксированной длины. За словом typlen следует указанное количество байтов данных.
  • -1. Тип данных varlena. Следующие четыре байта составляют заголовок varlena, определяющий общую длину значения (вместе с длиной заголовка).
  • <—1. Зарезервировано для использования в будущем.

Чтобы приложение, читающее этот формат, могло легко проверить целостность двоичных данных, со всеми полями, отличными от NULL, ассоциируется значение typlen, которое может сравниваться с полем typlen приемного поля перед попытками вставки или обновления данных в PostgreSQL.

Некоторые параметры форматирования остались нереализованными; такое решение было принято для лучшей переносимости двоичных файлов. Следует упомянуть о невозможности хранения дополнительных данных между полями (например, посредством дополнения при выравнивании), а также об отсутствии различий между типами данных по способу передачи (по ссылке и по значению).

Если в двоичный файл PostgreSQL включаются идентификаторы объектов (OID), они следуют сразу же после поля-счетчика. При подсчете полей значения OID не учитываются.

Завершение

Двоичные файлы PostgreSQL завершаются простым 16-разрядным целым числом -1, за которым следует конец файла. Значение легко отличается от начального 16-разрядного счетчика полей, и это обстоятельство упрощает синхронизацию данных в приложениях.