本节介绍用于检查和操作二进制字符串(即 bytea
类型的值)的函数和运算符。其中许多在目的和语法上都与上一节描述的文本字符串函数等效。
SQL定义了一些使用关键字而不是逗号分隔参数的字符串函数。详情请参阅 表 9.11。PostgreSQL 还提供了这些函数的版本,它们使用常规的函数调用语法(参见 表 9.12)。
表 9.11. SQL二进制字符串函数和运算符
函数/运算符
描述
示例
|
bytea || bytea → bytea
连接两个二进制字符串。
'\x123456'::bytea || '\x789a00bcde'::bytea → \x123456789a00bcde
|
bit_length ( bytea ) → integer
返回二进制字符串中的位数(octet_length 的 8 倍)。
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 个字节开始(如果指定了 start ),并以 count 字节结束(如果指定了 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.11 所示)的内部实现。
表 9.12. 其他二进制字符串函数
函数
描述
示例
|
bit_count ( bytes bytea ) → bigint
返回二进制字符串中设置为 1 的位数(也称为“popcount”)。
bit_count('\x1234567890'::bytea) → 15
|
crc32 ( bytea ) → bigint
计算二进制字符串的 CRC-32 值。
crc32('abc'::bytea) → 891568578
|
crc32c ( bytea ) → bigint
计算二进制字符串的 CRC-32C 值。
crc32c('abc'::bytea) → 910901175
|
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 哈希值,结果以十六进制表示。
md5('Th\000omas'::bytea) → 8ab2d3c9689aaf18b4958c334c82d8b1
|
reverse ( bytea ) → bytea
反转二进制字符串中字节的顺序。
reverse('\xabcd'::bytea) → \xcdab
|
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 哈希值。
sha224('abc'::bytea) → \x23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
|
sha256 ( bytea ) → bytea
计算二进制字符串的 SHA-256 哈希值。
sha256('abc'::bytea) → \xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
|
sha384 ( bytea ) → bytea
计算二进制字符串的 SHA-384 哈希值。
sha384('abc'::bytea) → \xcb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
|
sha512 ( bytea ) → bytea
计算二进制字符串的 SHA-512 哈希值。
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')
;要获取 bytea
值,可以写入 decode(md5('abc'), 'hex')
。
不同字符集(编码)之间的字符串转换函数,以及将任意二进制数据表示为文本形式的函数,请参阅 表 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 Section 6.8。根据 MIME 标准,编码行在 76 个字符处换行。但是,在行尾使用换行符而不是 MIME 的 CRLF 换行符。 decode
函数会忽略回车符、换行符、空格和制表符。否则,当 decode
收到无效的 base64 数据时会引发错误,包括尾部填充不正确的情况。RFC,编码后的行在 76 个字符处中断。但不是 MIME 的 CRLF 换行符,而只是使用换行符作为行尾。 decode
函数会忽略回车符、换行符、空格和制表符。否则,当 decode
收到无效的 base64 数据时,将引发错误 — 包括尾部填充不正确的情况。
- escape #
-
escape
格式将零字节和高位设置为 1 的字节转换为八进制转义序列(\
nnn
),并将反斜杠加倍。其他字节值按原样表示。如果反斜杠后面不是第二个反斜杠或三个八进制数字,decode
函数将引发错误;它将其他字节值按原样接受。
- hex #
-
hex
格式将数据的每个 4 位表示为一个十六进制数字,从 0
到 f
,并先写入每个字节的高位数字。 encode
函数以小写形式输出 a
-f
十六进制数字。由于数据单元最小为 8 位,因此 encode
返回的字符数总是偶数。 decode
函数接受大写或小写的 a
-f
字符。当 decode
收到无效的十六进制数据时会引发错误 — 包括收到奇数个字符时。
此外,还可以将整数值转换为 bytea
类型,反之亦然。将整数转换为 bytea
会根据整数类型的宽度生成 2、4 或 8 个字节。结果是整数的二补数表示,最高有效字节在前。一些示例:
1234::smallint::bytea \x04d2
cast(1234 as bytea) \x000004d2
cast(-1234 as bytea) \xfffffb2e
'\x8000'::bytea::smallint -32768
'\x8000'::bytea::integer 32768
将 bytea
转换为整数时,如果 bytea
的长度超过整数类型的宽度,将引发错误。
另请参阅 第 9.21 节 中的聚合函数 string_agg
,以及 第 33.4 节 中的大型对象函数。