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

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

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

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

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

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

При вводе значений типа bytea, байты определённых значений, которые используются как части строчных литералов в каких-либо операторах SQL должны быть экранированы (все байтовые значения могут быть экранированы). В общем случае, чтобы экранировать вводимое значение оно преобразуется в трёхциферное восьмеричное значение эквивалентное его десятичному значению и предваряется двумя символами обратная косая черта. 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. Например, роль экранирующего символа у вас можете также играть символ перевода строки и возврата каретки, если в таковые их автоматически будет преобразовывать ваш интерфейс.

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

Back to top

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