↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
开发快照。 PostgreSQL 20devel 尚未正式发布,内容仍可能变化。

9.5. 二进制串函数和操作符 #

本节描述用于检查和操作二进制字符串(即 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

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 hash,结果以十六进制形式写入。

md5('Th\000omas'::bytea) → 8ab2d3c9689aaf18​b4958c334c82d8b1

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 hash。

sha224('abc'::bytea) → \x23097d223405d8228642a477bda2​55b32aadbce4bda0b3f7e36c9da7

sha256 ( bytea ) → bytea

计算二进制字符串的 SHA-256 hash。

sha256('abc'::bytea) → \xba7816bf8f01cfea414140de5dae2223​b00361a396177a9cb410ff61f20015ad

sha384 ( bytea ) → bytea

计算二进制字符串的 SHA-384 hash。

sha384('abc'::bytea) → \xcb00753f45a35e8bb5a03d699ac65007​272c32ab0eded1631a8b605a43ff5bed​8086072ba1e7cc2358baeca134c825a7

sha512 ( bytea ) → bytea

计算二进制字符串的 SHA-512 hash。

sha512('abc'::bytea) → \xddaf35a193617abacc417349ae204131​12e6fa4e89a97ea20a9eeee64b55d39a​2192992a274fc1a836ba3c23a3feebbd​454d4423643ce80e2a9ac94fa54ca49f

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 值为:base32hex, base64, base64url, escape, hex。

encode('123\000\001', 'base64') → MTIzAAE=

decode ( string text, format text ) → bytea

从文本表示中解码二进制数据;支持的 format 值与 encode 相同。

decode('MTIzAAE=', 'base64') → \x3132330001


encode 和 decode 函数支持以下文本格式:

base32hex #

base32hex 格式是 RFC 4648 第 7 节定义的格式。它使用扩展十六进制字母表(0-9 和 A-V),这样按字节比较时可以保持编码数据的排序顺序。encode 函数输出以 '=' 填充的结果,而 decode 接受带填充和不带填充的输入。解码不区分大小写,并忽略空白字符。

这种格式适合以紧凑、按字节可排序的形式编码 UUID:rtrim(encode(uuid_value::bytea, 'base32hex'), '=') 可生成 26 个字符的字符串,相比标准 UUID 表示形式的 36 个字符更短。

注意

为了保持编码数据的字典顺序,请确保文本使用 C 排序规则排序(例如使用 COLLATE "C")。自然语言排序规则可能会以不同方式对字符排序,从而破坏这种顺序。

base64 #

base64 格式是 RFC 2045 第 6.8 节中描述的。根据 RFC,编码行在 76 个字符处换行。然而,与 MIME CRLF 换行符不同,行尾只使用一个换行符。decode 函数会忽略回车、换行、空格和制表符。否则,当向 decode 传入无效的 base64 数据时,包括尾部填充不正确时,会引发错误。

base64url #

base64url 格式是 RFC 4648 第 5 节定义的 base64 变体,适合用于文件名和 URL。base64url 字母表使用 '-' 代替 '+',使用 '_' 代替 '/',并且也省略 '=' 填充字符。

escape #

escape 格式将零字节和最高位被置位的字节转换为八进制转义序列 (\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.22 节中的聚合函数 string_agg 以及第 33.4 节中的大对象函数。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.