Двоичные типы данных

8.4. Двоичные типы данных

Тип bytea позволяет хранить двоичные строки; смотри Table 8-6.

Table 8-6. Двоичные типы данных

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

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

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

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

8.4.1. Шестнадцетеричный формат bytea

Шестнадцатеричный ("hex") формат кодирует двоичные данные как два шестнадцатеричных разряда на байт, старший разряд идёт первым. Строка целиком состоит из последовательности \x (что отличается от escape формата). В некоторых контекстах, может понадобится экранировать начальную обратную косую черту, дублируя её, в таких же случаях, в которых требуется двойная обратная косая черта в esacpe формате; подробности см. ниже. Шестнадцетеричные разряды могут быть как в верхнем, так и в нижнем регистре, а между парами цифр допускаются пробелы (но не внутри пары рарядов и не в начале последовательности \x). Шестнадцетричиный формат совместим с широким диапазоном внешних приложений и протоколов, а также он имеет тенденцию к более быстрому преобразованию данных, чем в случае escape формата, так что его использование является предпочтительным.

Пример:

SELECT E'\\xDEADBEEF';

8.4.2. Escape формат bytea

"Escape" формат является традиционным форматом для типа bytea в PostgreSQL. Он использует подход представления двоичной строки как последовательности ASCII символов, во время конвертации байты, которые не могут быть представлены как ASCII символы, заменяются специальными escape последовательностями. Если, с точки зрения приложения, представленние байтов как символов имеют смысл, то данное представление может быть подходящим. Но на практике это обычно запутывает, потому что затрудняет понимание разницы между двоичными строками и символьными строками, а тут ещё особый механизм экранирования, который является несколько громоздким. Таким образом, в большинстве новых приложений, использование данного формат предположительно нужно избегать

При вводе значений bytea в escape формате, конкретные значения должны быть экранированы, в то время как вообще все значения могут быть экранированы. В общем случае, чтобы экранировать вводимое значение оно преобразуется в трёхциферное восьмеричное значение эквивалентное его десятичному значению и предваряется обратной косой чертой (или двумя, если значение записывается как литерал, используя ситаксис зкранирования строк). Сам символ обратной косой черты (восьмеричное значение 92) может быть представлен двумя обратными косыми чертами. Table 8-7 показывает символы которые должны быть экранированы и предоставляет альтернативные escape последовательности там где это возможно.

Table 8-7. bytea Экранируемые литеральные значения

Десятичное значениеОписаниеКак нужно экранироватьПримерПредставление на выходе
0нольE'\\000'SELECT E'\\000'::bytea;\000
39одиночная кавычка'''' or E'\\047'SELECT E'\''::bytea;'
92обратная косая чертаE'\\\\' or E'\\134'SELECT E'\\\\'::bytea;\\
от 0 до 31 и от 127 до 255"непечатаемый" символE'\\xxx' (octal value)SELECT E'\\001'::bytea;\001

Требование об экранировании непечатаемых символов варьируется в зависимости от установок локали. В некоторых случаях вы можете оставлять их незаэкранированными. Заметим, что результат в каждом примере в Table 8-7 составлял точно один байт в длину, даже если предоставление иногда выглядит как более одного символа.

Причина, по которой требуется так много символов обратная косая черта в Table 8-7 заключается в том, что вводимый строковый литерал должен пройти на сервере PostgreSQL через две фазы обработки. Первая обратная косая черта каждой пары итерпретируется для обработчика строкового литерала (включая использование синтаксиса экранирования) как символ экранирования и, таким образом, опускается, оставляя второй символ обратная косая черта в паре. (Для того, чтобы избежать этого уровня экранирования можно использовать строки доллар-кавычка.) Оставшийся символ обратная косая черта затем распознаётся функцией ввода типа bytea, как начинающий трёхциферное восьмеричное значение или символ экранирования следующего символа обратная косая черта. Например, строковый литерал, передаваемый на сервер как 'E\\001' принимает вид \001 после обработчика строкового литерала. Далее \001 посылается функции ввода типа bytea, где преобразовывается в одиночный байт с десятичным значением 1. Заметим, что символ одиночной кавычки для bytea не считается специальным, так как он отвечает обычным правилам строковых литералов. (См. также Section 4.1.2.1.)

Значения Bytea при выводе иногда экранируются. Обычно, в виде эквивалентного трёхциферного восьмеричного значения, предваряемого символом обратная косая черта. Большинство "печатаемых" байт выводится в их стандартном представлении, согласно кодировке клиента. Символ с десятичным значением 92 (обратная косая черта) выводится дважды. Подробности смотрите в Table 8-8.

Table 8-8. bytea Экранированные значения на выводе

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

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

Back to top

(С) Виктор Вислобоков, 2008-2023