Тип данных bytea
Тип данных bytea
позволяет хранить двоичные строки переменной длины. Двоичная строка представляет собой последовательность октетов (байтов). Двоичные строки отличаются от строк символов следующим:
-
Двоичные строки позволяют хранить октеты нулевых значений и другие "непечатаемые" октеты. Строки символов не допускают нулевых октетов и любых других октетов, не соответствующих кодировке базы данных.
-
Операции с двоичными строками обрабатывают байты, обработка символьных строк зависит от настроек языковых стандартов.
Двоичные строки предназначены для операций с "сырыми байтами" ("raw bytes"), строки символов — для работы с текстом.
Тип данных bytea
добавляет 1 или 4 байта к размеру двоичной строки.
Bytea
поддерживает два формата ввода и вывода: hex
и исторический формат PostgreSQL escape
. Входящие данные могут быть в одном из этих форматов. Выходной формат определяет параметр конфигурации bytea_output, его значение по умолчанию — hex
.
Формат bytea hex
Формат hex
кодирует двоичные данные двумя шестнадцатеричными цифрами на байт. Он имеет следующий формат:
'\x<binary string>'
Пример:
SELECT '\xDEADBEEF';
Шестнадцатеричные цифры могут быть в верхнем или нижнем регистре, пробелы разрешены между парами цифр и запрещены внутри пары цифр и в начале последовательности \x
. Формат hex
совместим с широким спектром приложений и протоколов, и его преобразование происходит быстрее, чем формата escape
.
Формат bytea escape
Формат escape
— традиционный формат PostgreSQL для типа bytea
. Он представляет двоичную строку как последовательность символов ASCII и преобразует байты, которые не могут быть представлены в виде символов ASCII, в спецпоследовательности.
Чтобы заэкранировать октет, преобразуйте его в трехзначное восьмеричное значение и поставьте перед ним обратную косую черту (\
). Чтобы добавить символ обратной косой черты к двоичной строке, используйте двойную обратную косую черту (\\
). В то время как любое значение октета может быть заэкранировано, октеты из таблицы ниже должны быть заэкранированы.
Десятичное значение байта | Описание | Входящая спецпоследовательность | Пример | Шестнадцатеричное представление |
---|---|---|---|---|
0 |
Нулевой байт |
'\000' |
'\000'::bytea |
\x00 |
39 |
Одиночная кавычка |
'''' или '\047' |
''''::bytea |
\x27 |
92 |
Обратная косая черта |
'\\' или '\134' |
'\\'::bytea |
\x5c |
от 0 до 31 и от 127 до 255 |
"Непечатаемые" октеты |
'\xxx' (восьмеричное значение) |
'\001'::bytea |
\x01 |
Требования экранирования "непечатаемых" символов определяются настройками языковых стандартов.
Октеты bytea
по умолчанию выводятся в шестнадцатеричном формате.
Если вы измените bytea_output
на escape
, PostgreSQL преобразует "непечатаемые" октеты (десятичные значения октетов от 0 до 31 и от 127 до 255) в эквивалентные трехзначные восьмеричные значения. Печатные октеты выводятся в виде стандартного представления в кодировке клиента. Обратная косая черта при выводе дублируется.
Пример:
SET bytea_output = 'escape';
SELECT 'abc \144\145\146 \052 \251 \134'::bytea;
Результат:
bytea ------------------- abc def * \251 \\
РЕКОМЕНДАЦИЯ
Формат escape стирает различия между двоичными строками и символьными строками и имеет громоздкий механизм экранирования спецпоследовательностей.
Используйте формат hex вместо escape , если это возможно.
|
Функции и операторы для работы с двоичными строками
PostgreSQL предоставляет множество функций и операторов для работы с двоичными строками. Многие из них эквивалентны функциям для работы с текстовыми строками. В этом разделе приведены несколько примеров. За дополнительной информацией обратитесь к документации PostgreSQL: Binary string functions and operators.
SQL-функции и операторы
Ниже приведены некоторые SQL-операторы и функции, которые можно использовать для работы с двоичными строками:
-
Две двоичные строки можно объединить оператором
||
:SELECT '\x123456'::bytea || '\x789a00bcde'::bytea;
Результат:
\x123456789a00bcde
. -
Функция
position
возвращает начальный индекс первой найденной подстроки в байтах или ноль, если подстрока не найдена:SELECT position('\x5678'::bytea in '\x1234567890'::bytea);
Результат:
3
. -
Функция
substring
извлекает подстроку, которая начинается с указанного байта и имеет указанную длину в байтах. Функция имеет следующий синтаксис:substring ( bytes bytea [ FROM start integer ] [ FOR count integer ] ) → bytea
Пример:
SELECT substring('\x1234567890'::bytea from 3 for 2);
Результат:
\x5678
.
Функции для преобразования текстовых/двоичных строк
PostgreSQL позволяет конвертировать строки между различными кодировками и преобразовывать двоичные данные в текстовую форму. Доступные преобразования перечислены в статье Available character set conversions. Вы можете использовать следующие функции для преобразования:
-
convert
преобразует двоичную строку, содержащую текст в исходной кодировке, в двоичную строку в результирующей кодировке.convert ( <двоичная_строка> bytea, <исходная_кодировка>, <результирующая_кодировка> ) → bytea
Пример:
SELECT convert('text_in_utf8', 'UTF8', 'LATIN1');
Результат:
\x746578745f696e5f75746638
. -
convert_from
преобразует двоичную строку, содержащую текст в исходной кодировке, в текст в кодировке базы данных.convert_from ( <двоичная_строка> bytea, <исходная_кодировка> ) → text
Пример:
SELECT convert_from('\x746578745f696e5f75746638', 'UTF8');
Результат:
text_in_utf8
.
-
convert_to
преобразует текстовую строку в кодировке базы данных в двоичную строку в результирующей кодировке.convert_to ( <текстовая_строка> text, <результирующая_кодировка> ) → bytea
Пример:
SELECT convert_to('some_text', 'UTF8');
Результат:
\x736f6d655f74657874
. -
encode
кодирует двоичные данные в текстовое представление. Поддерживаемые форматы: base64,escape
,hex
.encode ( <двоичная_строка> bytea, <формат> text ) → text
Пример:
SELECT encode('\x41445047', 'base64');
Результат:
QURQRw==
. -
decode
декодирует двоичные данные из текстовой строки. Поддерживаемые форматы: base64,escape
,hex
.decode ( <текстовая_строка> text, <формат> text ) → bytea
Пример:
SELECT decode('QURQRw==', 'base64');
Результат:
\x41445047
.