9.5. Функции и операторы двоичных строк
В этом разделе описываются функции и операторы для работы с двоичными строками, то есть со значениями типа bytea. Многие из них идентичны по функциональности и синтаксису описанным в предыдущем разделе функциям, предназначенным для текстовых строк.
В SQL определены несколько строковых функций, в которых аргументы разделяются не запятыми, а ключевыми словами. Подробнее это описано в Таблице 9.11. PostgreSQL также предоставляет варианты этих функций с синтаксисом, обычным для функций (см. Таблицу 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 и функции для работы с большими объектами в Разделе 34.4.