本节介绍用于检查和操作二进制字符串(即 bytea 类型的值)的函数和运算符。其中许多在目的和语法上都与上一节描述的文本字符串函数等效。
SQL定义了一些使用关键字而不是逗号分隔参数的字符串函数。详情请参阅 表 9.11。PostgreSQL 还提供了这些函数的版本,它们使用常规的函数调用语法(参见 表 9.12)。
表 9.11. SQL二进制字符串函数和运算符
其他二进制字符串操作函数可在 表 9.12 中找到。其中一些函数用于内部实现表 9.11 中列出的标准字符串函数。SQL- 标准字符串函数(如表 9.11 所示)的内部实现。
表 9.12. 其他二进制字符串函数
|
函数 描述 示例 |
|---|
|
返回二进制字符串中设置为 1 的位数(也称为“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');要获取 bytea 值,可以写入 decode(md5('abc'), 'hex')。
不同字符集(编码)之间的字符串转换函数,以及将任意二进制数据表示为文本形式的函数,请参阅 表 9.13。对于这些函数,类型为 text
的参数或结果以数据库的默认编码表示,而类型为 bytea 的参数或结果以由另一个参数命名的编码表示。
表 9.13. 文本/二进制字符串转换函数
|
函数 描述 示例 |
|---|
|
将表示
|
|
将表示
|
|
将
|
|
将二进制数据编码为文本表示;支持的
|
|
将二进制数据从文本表示解码;支持的
|
encode 和 decode 函数支持以下文本格式:
base64 格式符合 RFC 2045
Section 6.8。根据 MIME 标准,编码行在 76 个字符处换行。但是,在行尾使用换行符而不是 MIME 的 CRLF 换行符。 decode 函数会忽略回车符、换行符、空格和制表符。否则,当 decode
收到无效的 base64 数据时会引发错误,包括尾部填充不正确的情况。RFC,编码后的行在 76 个字符处中断。但不是
MIME 的 CRLF 换行符,而只是使用换行符作为行尾。 decode 函数会忽略回车符、换行符、空格和制表符。否则,当
decode 收到无效的 base64 数据时,将引发错误 — 包括尾部填充不正确的情况。
escape 格式将零字节和高位设置为 1 的字节转换为八进制转义序列(\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 转换为整数时,如果 bytea 的长度超过整数类型的宽度,将引发错误。