PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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

本节描述用于检查和操作二进制字符串的函数和操作符, 二进制字符串就是 bytea 类型的值。 其中许多在用途和语法上与上一节描述的文本字符串函数等价。

SQL 定义了一些使用关键字而非逗号来分隔参数的字符串函数。 细节见 Table 9.11。 PostgreSQL 还提供了这些函数的使用常规函数调用语法的版本 (参见 Table 9.12)。

Table 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

把 bytes 中从第 start 个字节开始、 延续 count 个字节的子串 替换为 newsubstring。 如果省略了 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


还有更多二进制字符串操作函数可用, 它们列在 Table 9.12 中。 其中一些在内部用于实现 Table 9.11 中列出的 SQL 标准字符串函数。

Table 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 哈希, 结果以十六进制写出。

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 哈希。

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

sha256 ( bytea ) → bytea

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

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

sha384 ( bytea ) → bytea

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

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

sha512 ( bytea ) → bytea

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

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

用于在不同字符集 (编码) 之间转换字符串, 以及以文本形式表示任意二进制数据的函数, 展示在 Table 9.13 中。 对于这些函数, text 类型的参数或结果以数据库的默认编码表示, 而 bytea 类型的参数或结果则以另一个参数所指定的编码表示。

Table 9.13. 文本/二进制字符串转换函数

函数

说明

示例

convert ( bytes bytea, src_encoding name, dest_encoding name ) → bytea

把一个以 src_encoding 编码表示文本的二进制字符串, 转换为以 dest_encoding 编码表示的二进制字符串 (可用的转换请参见 Section 23.3.4)。

convert('text_in_utf8', 'UTF8', 'LATIN1') → \x746578745f696e5f75746638

convert_from ( bytes bytea, src_encoding name ) → text

把一个以 src_encoding 编码表示文本的二进制字符串, 转换为以数据库编码表示的 text (可用的转换请参见 Section 23.3.4)。

convert_from('text_in_utf8', 'UTF8') → text_in_utf8

convert_to ( string text, dest_encoding name ) → bytea

把一个 text 字符串 (以数据库编码表示) 转换为一个以 dest_encoding 编码的二进制字符串 (可用的转换请参见 Section 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 被给予无效的十六进制数据时会抛出错误 — 包括被给予奇数个字符的情形。

此外, 可以在整数值与 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 的长度超过整数类型的宽度, 把它转换为整数会抛出错误。

另请参见 Section 9.21 中的聚集函数 string_agg, 以及 Section 33.4 中的大对象函数。