9.5. Функции и операторы двоичных строк

В этом разделе описываются функции и операторы для работы с данными типа bytea.

В SQL определены несколько строковых функций, в которых аргументы разделяются не запятыми, а ключевыми словами. Подробнее это описано в Таблице 9.11. Postgres Pro также предоставляет варианты этих функций с синтаксисом, обычным для функций (см. Таблицу 9.12).

Примечание

В примерах, приведённых на этой странице, подразумевается, что параметр сервера bytea_output равен escape (выбран традиционный формат Postgres Pro).

Таблица 9.11. SQL-функции и операторы для работы с двоичными строками

ФункцияТип результатаОписаниеПримерРезультат
string || stringbyteaКонкатенация строк '\\Post'::bytea || '\047gres\000'::bytea\\Post'gres​\000
octet_length(string)intЧисло байт в двоичной строкеoctet_length('jo\000se'::bytea)5
overlay(string placing string from int [for int])byteaЗаменяет подстрокуoverlay('Th\000omas'::bytea placing '\002\003'::bytea from 2 for 3)T\\002​\\003​mas
position(substring in string)intПоложение указанной подстрокиposition('\000om'::bytea in 'Th\000omas'::bytea)3
substring(string [from int] [for int])byteaИзвлекает подстрокуsubstring('Th\000omas'::bytea from 2 for 3)h\000o
trim([both] bytes from string)byteaУдаляет наибольшую строку, содержащую только байты, заданные в параметре bytes, с начала и с конца строки stringtrim('\000\001'::bytea from '\000Tom\001'::bytea)Tom

В PostgreSQL есть и другие функции для работы с двоичными строками, перечисленные в Таблице 9.12. Некоторые из них используются в качестве внутренней реализации стандартных функций SQL, приведённых в Таблице 9.11.

Таблица 9.12. Другие функции для работы с двоичными строками

ФункцияТип результатаОписаниеПримерРезультат
btrim(string bytea, bytes bytea)byteaУдаляет наибольшую строку, содержащую только байты, заданные в параметре bytes, с начала и с конца строки stringbtrim('\000trim\001'::bytea, '\000\001'::bytea)trim
decode(string text, format text)byteaПолучает двоичные данные из текстового представления в string. Значения параметра format те же, что и для функции encode.decode('123\000456', 'escape')123\000456
encode(data bytea, format text)textПереводит двоичные данные в текстовое представление в одном из форматов: base64, hex, escape. Формат escape преобразует нулевые байты и байты с 1 в старшем бите в восьмеричные последовательности \nnn и дублирует обратную косую черту.encode('123\000456'::bytea, 'escape')123\000456
get_bit(string, offset)intИзвлекает бит из строкиget_bit('Th\000omas'::bytea, 45)1
get_byte(string, offset)intИзвлекает байт из строкиget_byte('Th\000omas'::bytea, 4)109
length(string)intДлина двоичной строки length('jo\000se'::bytea)5
md5(string)textВычисляет MD5-хеш строки string и возвращает результат в 16-ричном видеmd5('Th\000omas'::bytea)8ab2d3c9689aaf18​b4958c334c82d8b1
set_bit(string, offset, newvalue)byteaУстанавливает значение бита в строкеset_bit('Th\000omas'::bytea, 45, 0)Th\000omAs
set_byte(string, offset, newvalue)byteaУстанавливает значение байта в строкеset_byte('Th\000omas'::bytea, 4, 64)Th\000o@as
sha224(bytea)byteaХеш SHA-224sha224('abc')\x23097d223405d8228642a477bda2​55b32aadbce4bda0b3f​7e36c9da7
sha256(bytea)byteaХеш SHA-256sha256('abc')\xba7816bf8f01cfea414140de5dae2223​b00361a396177a9​cb410ff61f20015ad
sha384(bytea)byteaХеш SHA-384sha384('abc')\xcb00753f45a35e8bb5a03d699ac65007​272c32ab0eded16​31a8b605a43ff5bed​8086072ba1e7cc2358baeca134c825a7
sha512(bytea)byteaХеш SHA-512sha512('abc')\xddaf35a193617abacc417349ae204131​12e6fa4e89a97ea​20a9eeee64b55d39a​2192992a274fc1a836ba3c23a3feebbd​​454d4423643ce80e2a9ac94fa54ca49f

Для функций get_byte и set_byte байты нумеруется с 0. Функции get_bit и set_bit нумеруют биты справа налево; например, бит 0 будет меньшим значащим битом первого байта, а бит 15 — большим значащим битом второго байта.

Заметьте, что по историческим причинам функция md5 возвращает значение в шестнадцатеричном виде в типе text, тогда как функции SHA-2 возвращают тип bytea. Используйте функции encode и decode для преобразования значений из одного представления в другое. Например, вызвав encode(sha256('abc'), 'hex'), вы получите значение в шестнадцатеричном виде в строке.

См. также агрегатную функцию string_agg в Разделе 9.20 и функции для работы с большими объектами в Разделе 34.4.