本节描述那些检查和操作二进制字符串的函数和操作符,这是类型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'th 位。
|
|
从二进制字符串中提取 n'th 字节。
|
|
返回二进制字符串中的字节数。
|
|
返回二进制字符串中的字符数,假设它是给定
|
|
从
|
|
计算二进制字符串的MD5 hash,结果以十六进制形式写入。
|
|
从
|
|
设置二进制字符串中的n'th位为
|
|
设置二进制字符串中的 n'th 字节到
|
|
计算二进制字符串的 SHA-224 hash。
|
|
计算二进制字符串的 SHA-256 hash。
|
|
计算二进制字符串的 SHA-384 hash。
|
|
计算二进制字符串的 SHA-512 hash。
|
|
从
|
函数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函数支持以下文本格式:
base32hex 格式是 RFC 4648 第 7 节定义的格式。它使用扩展十六进制字母表(0-9 和 A-V),这样按字节比较时可以保持编码数据的排序顺序。encode函数输出 以 '=' 填充的结果,而decode接受带填充和不带填充的输入。解码不区分大小写,并忽略空白字符。
这种格式适合以紧凑、按字节可排序的形式编码 UUID:rtrim(encode(uuid_value::bytea, 'base32hex'), '=') 可生成 26 个字符的字符串,相比标准 UUID 表示形式的 36 个字符更短。
为了保持编码数据的字典顺序,请确保文本使用 C 排序规则排序(例如使用COLLATE "C")。 自然语言排序规则可能会以不同方式对字符排序,从而破坏这种顺序。
base64格式是RFC 2045第6.8节中描述的。根据RFC,编码行在76个字符处换行。 然而,与MIME CRLF换行符不同,结尾只使用换行符。 decode函数会忽略回车、换行、空格和制表符。 否则,当decode提供无效的base64数据时,包括尾部填充不正确时,会引发错误。
base64url 格式是 RFC 4648 第 5 节定义的 base64 变体,适合用于文件名和 URL。 base64url 字母表使用 '-' 代替 '+',使用 '_' 代替 '/',并且也省略 '=' 填充字符。
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转换为整数时,如果bytea的长度超过该整数类型的宽度,就会引发错误。
参见Section 9.22中的聚合函数string_agg以及Section 33.4中的大对象函数。