本节描述用于检查和操作二进制字符串(即 bytea 类型的值)的函数和操作符。其中许多函数在用途和语法上都与上一节中描述的文本字符串函数等效。
SQL 定义了一些使用关键字而不是逗号来分隔参数的字符串函数。详情请见表 9.11。PostgreSQL 也提供了这些函数使用常规函数调用语法的版本(参阅表 9.12)。
表 9.11. SQL 二进制串函数和操作符
函数/操作符
描述
示例
|
|---|
bytea || bytea
→ bytea
串接两个二进制字符串。
'\x123456'::bytea || '\x789a00bcde'::bytea
→ \x123456789a00bcde
|
bit_length ( bytea )
→ integer
返回二进制字符串中的位数(8 倍于 octet_length)。
bit_length('\x123456'::bytea)
→ 24
|
btrim ( bytes bytea,
bytesremoved bytea )
→ bytea
从 bytes 的开头和结尾移除仅由 bytesremoved 中字节组成的最长字符串。
btrim('\x1234567890'::bytea, '\x9012'::bytea)
→ \x345678
|
ltrim ( bytes bytea,
bytesremoved bytea )
→ bytea
从 bytes 的开头移除仅由 bytesremoved 中字节组成的最长字符串。
ltrim('\x1234567890'::bytea, '\x9012'::bytea)
→ \x34567890
|
octet_length ( bytea )
→ integer
返回二进制字符串中的字节数。
octet_length('\x123456'::bytea)
→ 3
|
overlay ( bytes bytea PLACING newsubstring bytea FROM start integer [ FOR count integer ] )
→ bytea
用 newsubstring 替换 bytes 中从第 start 个字节开始、长度为 count 个字节的子字符串。如果省略 count,则默认为 newsubstring 的长度。
overlay('\x1234567890'::bytea placing '\002\003'::bytea from 2 for 3)
→ \x12020390
|
position ( substring bytea IN bytes bytea )
→ integer
返回 substring 在 bytes 中首次出现的位置;如果不存在则返回零。
position('\x5678'::bytea in '\x1234567890'::bytea)
→ 3
|
rtrim ( bytes bytea,
bytesremoved bytea )
→ bytea
从 bytes 的结尾移除仅由 bytesremoved 中字节组成的最长字符串。
rtrim('\x1234567890'::bytea, '\x9012'::bytea)
→ \x12345678
|
substring ( bytes bytea [ FROM start integer ] [ FOR count integer ] )
→ bytea
提取 bytes 的子字符串:若指定了起始位置,则从第 start 个字节开始;若指定了长度,则在提取 count 个字节后停止。start 和 count 至少需要指定一个。
substring('\x1234567890'::bytea from 3 for 2)
→ \x5678
|
trim ( [ LEADING | TRAILING | BOTH ]
bytesremoved bytea FROM
bytes bytea )
→ bytea
从 bytes 的开头、结尾或两端(默认为 BOTH)移除仅由 bytesremoved 中字节组成的最长字符串。
trim('\x9012'::bytea from '\x1234567890'::bytea)
→ \x345678
|
trim ( [ LEADING | TRAILING | BOTH ] [ FROM ]
bytes bytea,
bytesremoved bytea )
→ bytea
这是一个非标准的 trim() 语法。
trim(both from '\x1234567890'::bytea, '\x9012'::bytea)
→ \x345678
|
还有一些二进制串处理函数可以使用,在表 9.12 列出。其中有一些是在内部使用,用于实现表 9.11 列出的 SQL 标准串函数。
表 9.12. 其他二进制串函数
函数
描述
示例
|
|---|
bit_count ( bytes bytea )
→ bigint
返回二进制字符串中被置位的位数(也称为“popcount”)。
bit_count('\x1234567890'::bytea)
→ 15
|
get_bit ( bytes bytea,
n bigint )
→ integer
从二进制字符串中提取编号为 n 的位。
get_bit('\x1234567890'::bytea, 30)
→ 1
|
get_byte ( bytes bytea,
n integer )
→ integer
从二进制字符串中提取编号为 n 的字节。
get_byte('\x1234567890'::bytea, 4)
→ 144
|
length ( bytea )
→ integer
返回二进制字符串中的字节数。
length('\x1234567890'::bytea)
→ 5
|
length ( bytes bytea,
encoding name )
→ integer
返回二进制字符串中的字符数,假设它是给定 encoding 中的文本。
length('jose'::bytea, 'UTF8')
→ 4
|
md5 ( bytea )
→ text
计算二进制字符串的 MD5 hash,结果以十六进制形式写入。
md5('Th\000omas'::bytea)
→ 8ab2d3c9689aaf18b4958c334c82d8b1
|
set_bit ( bytes bytea,
n bigint,
newvalue integer )
→ bytea
设置二进制字符串中的编号为 n 的位为 newvalue。
set_bit('\x1234567890'::bytea, 30, 0)
→ \x1234563890
|
set_byte ( bytes bytea,
n integer,
newvalue integer )
→ bytea
将二进制字符串中编号为 n 的字节设置为 newvalue。
set_byte('\x1234567890'::bytea, 4, 64)
→ \x1234567840
|
sha224 ( bytea )
→ bytea
计算二进制字符串的 SHA-224 hash。
sha224('abc'::bytea)
→ \x23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
|
sha256 ( bytea )
→ bytea
计算二进制字符串的 SHA-256 hash。
sha256('abc'::bytea)
→ \xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
|
sha384 ( bytea )
→ bytea
计算二进制字符串的 SHA-384 hash。
sha384('abc'::bytea)
→ \xcb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
|
sha512 ( bytea )
→ bytea
计算二进制字符串的 SHA-512 hash。
sha512('abc'::bytea)
→ \xddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
|
substr ( bytes bytea, start integer [, count integer ] )
→ bytea
提取 bytes 中从第 start 个字节开始的子字符串;若指定了长度,则提取 count 个字节。(与 substring(bytes from start for count) 相同。)
substr('\x1234567890'::bytea, 3, 2)
→ \x5678
|
函数 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. 文本/二进制串转换函数
函数
描述
示例
|
|---|
convert ( bytes bytea,
src_encoding name,
dest_encoding name )
→ bytea
将表示编码 src_encoding 的文本的二进制字符串转换为编码 dest_encoding 的二进制字符串(适用的转换请参阅第 23.3.4 节)。
convert('text_in_utf8', 'UTF8', 'LATIN1')
→ \x746578745f696e5f75746638
|
convert_from ( bytes bytea,
src_encoding name )
→ text
将表示编码 src_encoding 的文本的二进制字符串转换为数据库编码中的 text。(适用的转换请参阅第 23.3.4 节)。
convert_from('text_in_utf8', 'UTF8')
→ text_in_utf8
|
convert_to ( string text,
dest_encoding name )
→ bytea
将 text 字符串(数据库编码)转换为编码 dest_encoding 中编码的二进制字符串。(适用的转换请参阅第 23.3.4 节)。
convert_to('some_text', 'UTF8')
→ \x736f6d655f74657874
|
encode ( bytes bytea,
format text )
→ text
将二进制数据编码成文本表示;支持的 format 值为:base64,
escape,
hex。
encode('123\000\001', 'base64')
→ MTIzAAE=
|
decode ( string text,
format text )
→ bytea
从文本表示中解码二进制数据;支持的 format 值与 encode 相同。
decode('MTIzAAE=', 'base64')
→ \x3132330001
|
encode 和 decode 函数支持以下文本格式:
- base64
#
base64 格式是 RFC
2045 第 6.8 节中描述的。根据 RFC,编码行在 76 个字符处换行。然而,与 MIME CRLF 换行符不同,行尾只使用一个换行符。decode 函数会忽略回车、换行、空格和制表符。否则,当向 decode 传入无效的 base64 数据时,包括尾部填充不正确时,会引发错误。
- escape
#
escape 格式将零字节和最高位被置位的字节转换为八进制转义序列
(\nnn),并将反斜杠双写。其他字节值会直接表示。如果反斜杠后面不是第二个反斜杠或三个八进制数字,则 decode 函数会引发错误;它会接受其他字节值不变。
- hex
#
hex 格式将每 4 位数据表示为一个十六进制数字,0 到 f,先写入每个字节的高位数字。encode 函数以小写输出 a-f 十六进制数字。因为数据的最小单位是 8 位,所以 encode 总是返回偶数个字符。decode 函数接受 a-f 字符的大小写。当向 decode 传入无效的十六进制数据时,包括提供奇数个字符时,会引发错误。
参见第 9.21 节中的聚合函数 string_agg 以及第 33.4 节中的大对象函数。