本节描述用于检查和操作二进制字符串的函数和操作符,
二进制字符串就是
bytea
类型的值。
其中许多在用途和语法上与上一节描述的文本字符串函数等价。
SQL 定义了一些使用关键字而非逗号来分隔参数的字符串函数。 细节见 Table 9.11。 PostgreSQL 还提供了这些函数的使用常规函数调用语法的版本 (参见 Table 9.12)。
Table 9.11. 标准 SQL 二进制字符串函数
还有更多二进制字符串操作函数可用, 它们列在 Table 9.12 中。 其中一些在内部用于实现 Table 9.11 中列出的 SQL 标准字符串函数。
Table 9.12. 其他二进制字符串函数
函数 说明 示例 |
|---|
返回二进制字符串中被置位的位数 (也被称为 “popcount”)。
|
|
计算二进制字符串的 CRC-32 值。
|
|
计算二进制字符串的 CRC-32C 值。
|
从二进制字符串中提取 第 n 个位。
|
从二进制字符串中提取 第 n 个字节。
|
|
返回二进制字符串中的字节数。
|
返回二进制字符串中的字符数,
假定它是以给定的
|
|
计算二进制字符串的 MD5 哈希, 结果以十六进制写出。
|
|
反转二进制字符串中字节的顺序。
|
把二进制字符串中的
第
n 个位设置为
|
把二进制字符串中的
第
n 个字节设置为
|
|
计算二进制字符串的 SHA-224 哈希。
|
|
计算二进制字符串的 SHA-256 哈希。
|
|
计算二进制字符串的 SHA-384 哈希。
|
|
计算二进制字符串的 SHA-512 哈希。
|
提取
|
函数 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. 文本/二进制字符串转换函数
函数 说明 示例 |
|---|
把一个以
|
把一个以
|
把一个
|
把二进制数据编码为一种文本表示;
受支持的
|
从一种文本表示解码二进制数据;
受支持的
|
encode 和
decode
函数支持以下文本格式:
base64
格式即
RFC
2045 第 6.8 节
所规定的格式。
按照该
RFC,
编码的行会在 76
个字符处断开。
不过,
行结尾使用的是一个换行符,
而非 MIME 的 CRLF
行尾标记。
decode
函数会忽略回车、换行、空格和制表符。
否则,
当
decode
被给予无效的 base64
数据时会抛出错误
— 包括尾部填充不正确的情形。
escape
格式把零字节和最高位被置位的字节转换为八进制转义序列
(\nnn),
并且把反斜杠写成双份。
其他字节值按字面表示。
如果一个反斜杠后面既没有跟第二个反斜杠,
也没有跟三个八进制数字,
decode
函数会抛出一个错误;
它按原样接受其他字节值。
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
中的大对象函数。