8.4. Бинарные типы данных#

8.4. Бинарные типы данных

8.4. Бинарные типы данных #

Тип данных bytea позволяет хранить двоичные строки; см. Таблица 8.6.

Таблица 8.6. Бинарные типы данных

ИмяРазмер хранилищаОписание
bytea1 или 4 байта плюс фактическая двоичная строкадвоичная строка переменной длины

Бинарная строка - это последовательность октетов (или байтов). Бинарные строки отличаются от символьных строк двумя способами. Во-первых, бинарные строки специально позволяют хранить октеты со значением ноль и другие непечатаемые октеты (обычно октеты вне десятичного диапазона от 32 до 126). Символьные строки запрещают нулевые октеты, а также запрещают любые другие значения октетов и последовательности значений октетов, которые недопустимы согласно выбранной кодировке набора символов базы данных. Во-вторых, операции с бинарными строками обрабатывают фактические байты, в то время как обработка символьных строк зависит от настроек локали. Короче говоря, бинарные строки подходят для хранения данных, которые программист представляет себе как сырые байты, в то время как символьные строки подходят для хранения текста.

Тип bytea поддерживает два формата для ввода и вывода: формат hex и исторический формат escape PostgreSQL. Оба этих формата всегда принимаются при вводе. Формат вывода зависит от параметра конфигурации bytea_output; по умолчанию используется формат hex. (Обратите внимание, что формат hex был введен в PostgreSQL 9.0; более ранние версии и некоторые инструменты его не понимают.)

Стандарт SQL определяет другой тип двоичной строки, называемый BLOB или BINARY LARGE OBJECT. Формат ввода отличается от bytea, но предоставляемые функции и операторы в основном такие же.

8.4.1. bytea Формат в шестнадцатеричной системе #

Формат hex кодирует двоичные данные в виде 2-х шестнадцатеричных цифр на байт, сначала наиболее значимый полубайт. Вся строка предшествует последовательности \x (для отличия от формата экранирования). В некоторых контекстах начальную обратную косую черту может потребоваться удвоить (см. Раздел 4.1.2.1). При вводе шестнадцатеричные цифры могут быть как в верхнем, так и в нижнем регистре, и между парой цифр допускается наличие пробелов (но не внутри пары цифр и не в начальной последовательности \x). Формат hex совместим с широким спектром внешних приложений и протоколов, и его преобразование обычно происходит быстрее, чем формат экранирования, поэтому его использование предпочтительно.

Пример:

SET bytea_output = 'hex';

SELECT '\xDEADBEEF'::bytea;
   bytea
------------
 \xdeadbeef

8.4.2. bytea Формат экранирования #

Формат escape является традиционным форматом Tantor SE-1C для типа bytea. Он представляет двоичную строку в виде последовательности ASCII-символов, преобразуя те байты, которые не могут быть представлены в виде ASCII-символа, в специальные последовательности экранирования. Если с точки зрения приложения имеет смысл представлять байты в виде символов, то такое представление может быть удобным. Однако на практике оно обычно вызывает путаницу между двоичными строками и строками символов, а также выбранный механизм экранирования неудобен. Поэтому этот формат, вероятно, следует избегать в большинстве новых приложений.

При вводе значений bytea в формате escape, определенные октеты значений должны быть экранированы, в то время как все октеты значений могут быть экранированы. Обычно, для экранирования октета, преобразуйте его в его трехзначное восьмеричное значение и предшествуйте ему обратной косой чертой. Сама обратная косая черта (десятичное значение октета 92) может быть представлена двойной обратной косой чертой. Таблица 8.7 показывает символы, которые должны быть экранированы, и предоставляет альтернативные последовательности экранирования, где это применимо.

Таблица 8.7. bytea Буквенные экранированные октеты

Десятичное значение октетаОписаниеЭкранированное представление вводаПримерШестнадцатеричное представление
0ноль октет'\000''\000'::bytea\x00
39апостроф'''' или '\047'''''::bytea\x27
92обратная косая черта'\\' или '\134''\\'::bytea\x5c
0 до 31 и 127 до 255непечатаемые октеты'\xxx' (восьмеричное значение)'\001'::bytea\x01

Требование к экранированию непечатаемых октетов зависит от настроек локали. В некоторых случаях их можно оставить неэкранированными.

Причина, по которой апострофы должны быть удвоены, как показано в Таблица 8.7, заключается в том, что это верно для любой строковой литеры в SQL-команде. Общий парсер строковых литер потребляет наружные апострофы и сокращает любую пару апострофов до одного символа данных. То, что видит функция ввода bytea, это просто один апостроф, которую она рассматривает как обычный символ данных. Однако функция ввода bytea рассматривает обратные косые черты как специальные символы, и другие поведения, показанные в Таблица 8.7, реализуются этой функцией.

В некоторых контекстах обратные косые черты должны быть удвоены по сравнению с тем, что показано выше, потому что общий парсер строковых литералов также сокращает пары обратных косых черт до одного символа данных; см. Раздел 4.1.2.1.

Bytea октеты по умолчанию выводятся в формате hex. Если вы измените bytea_output на escape, непечатаемые октеты будут преобразованы в их эквивалентное трехзначное восьмеричное значение и предварены обратной косой чертой. Большинство печатаемых октетов выводятся в стандартном представлении в клиентской кодировке символов, например:

SET bytea_output = 'escape';

SELECT 'abc \153\154\155 \052\251\124'::bytea;
     bytea
----------------
 abc klm *\251T

Октет с десятичным значением 92 (обратная косая черта) удваивается в выводе. Подробности приведены в Таблица 8.8.

Таблица 8.8. bytea Вывод экранированных октетов

Десятичное значение октетаОписаниеЭкранированное представление выводаПримерРезультат вывода
92обратная косая черта\\'\134'::bytea\\
0 до 31 и 127 до 255непечатаемые октеты\xxx (восьмеричное значение)'\001'::bytea\001
32 to 126печатаемые октетыпредставление в клиентском наборе символов'\176'::bytea~

В зависимости от используемого пользовательского интерфейса для Tantor SE-1C вам может потребоваться выполнить дополнительную работу по экранированию и деэкранированию строк типа bytea. Например, вам также может потребоваться экранировать символы перевода строки и возврата каретки, если ваш интерфейс автоматически выполняет их перевод.