9.5. Функции и операторы двоичных строк
В этом разделе описываются функции и операторы для работы с двоичными строками, то есть со значениями типа bytea
. Многие из них идентичны по функциональности и синтаксису описанным в предыдущем разделе функциям, предназначенным для текстовых строк.
В SQL определены несколько строковых функций, в которых аргументы разделяются не запятыми, а ключевыми словами. Подробнее это описано в Таблице 9.11. Postgres Pro также предоставляет варианты этих функций с синтаксисом, обычным для функций (см. Таблицу 9.12).
Таблица 9.11. SQL-функции и операторы для работы с двоичными строками
В PostgreSQL есть и другие функции для работы с двоичными строками, перечисленные в Таблице 9.12. Некоторые из них используются в качестве внутренней реализации стандартных функций SQL, приведённых в Таблице 9.11.
Таблица 9.12. Другие функции для работы с двоичными строками
Функция Описание Пример(ы) |
---|
Удаляет наибольшую строку, содержащую только байты, заданные в параметре
|
Извлекает из двоичной строки бит с номером n.
|
Извлекает из двоичной строки байт с номером n.
|
Выдаёт число байт в двоичной строке.
|
Выдаёт число символов в двоичной строке, в предположении, что она содержит текст в кодировке
|
Вычисляет MD5-хеш двоичной строки и выдаёт результат в шестнадцатеричном виде.
|
Устанавливает в двоичной строке для бита с номером n значение
|
Устанавливает в двоичной строке для байта с номером n значение
|
Вычисляет хеш SHA-224 для двоичной строки.
|
Вычисляет хеш SHA-256 для двоичной строки.
|
Вычисляет хеш SHA-384 для двоичной строки.
|
Вычисляет хеш SHA-512 для двоичной строки.
|
Извлекает из
|
Для функций get_byte
и set_byte
байты нумеруется с 0. Функции get_bit
и set_bit
нумеруют биты справа налево; например, бит 0 будет меньшим значащим битом первого байта, а бит 15 — большим значащим битом второго байта.
По историческим причинам функция md5
возвращает значение в шестнадцатеричном виде в типе text
, тогда как функции SHA-2 возвращают тип bytea
. Для преобразования значения из одного представления в другое используйте функции encode
и decode
. Например, вызвав encode(sha256('abc'), 'hex')
, вы получите значение в шестнадцатеричном виде в текстовой строке, а decode(md5('abc'), 'hex')
выдаст значение bytea
.
В Таблице 9.13 показаны функции для перекодирования текста из одного набора символов (кодировки) в другой и для представления произвольных двоичных данных в текстовом виде. Для всех этих функций аргумент или результат типа text
содержит текст в текущей кодировке базы данных, тогда как аргументы или результаты типа bytea
содержат текст в кодировке, заданной соответствующим аргументом.
Таблица 9.13. Функции для преобразования текстовых/двоичных строк
Функция Описание Пример(ы) |
---|
Преобразует двоичную строку, содержащую текст в кодировке
|
Преобразует двоичную строку, содержащую текст в кодировке
|
Преобразует строку типа
|
Переводит двоичные данные в текстовое представление; поддерживаются следующие значения
|
Переводит двоичные данные из текстового представления; поддерживает те же значения
|
Функции encode
и decode
поддерживают следующие текстовые форматы:
- base64
Формат
base64
описан в RFC 2045, Разделе 6.8. Согласно этому RFC, закодированные строки разбиваются по 76 символов. Однако завершаются строки не символами CRLF (как требуется в соответствии с MIME), а одним символом конца строки. Функцияdecode
, с другой стороны, игнорирует символы перевода каретки, новой строки, пробелы и табуляции. Если на входdecode
поступают некорректные данные base64, возникает ошибка — в том числе, если оказывается некорректным завершающее выравнивание.- escape
В формате
escape
нулевые байты и байты с установленным старшим битом переводятся в восьмеричные спецпоследовательности (\
nnn
), а обратная косая черта дублируется. Другие байтовые значения представляются в буквальном виде. Функцияdecode
выдаст ошибку, встретив обратную косую черту, за которой не следует ещё одна обратная косая или три восьмеричных цифры; другие значения байта она принимает без изменений.- hex
В формате
hex
каждые 4 бита данных представляются одной шестнадцатеричной цифрой, от0
доf
, при этом первой идёт цифра, представляющая старшие биты. Шестнадцатеричные цифрыa
-f
функцияencode
выводит в нижнем регистре. Так как наименьшая единица данных — байт (8 бит), функцияencode
всегда возвращает чётное количество символов. Функцияdecode
, с другой стороны, принимает символыa
-f
в любом регистре. Если на вход функцииdecode
поступают некорректные данные, возникает ошибка — в том числе, если число символов оказывается нечётным.
См. также агрегатную функцию string_agg
в Разделе 9.21 и функции для работы с большими объектами в Разделе 33.4.