↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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

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值为: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转换为整数时,如果bytea的长度超过整数类型的宽度,则会引发错误。

参见第 9.21 节中的聚合函数string_agg以及第 33.4 节中的大对象函数。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题请通过上游文档表单反馈给 PostgreSQL 文档维护者。