Тип данных 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.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней