Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

9.5. 二进制字符串函数和运算符 #

本节介绍用来检查和处理二进制字符串(即类型为 bytea 的值)的函数和运算符。很多函数和运算符在目的和语法上与上一节描述的文本字符串函数和运算符等效。

SQL定义了一些字符串函数,这些函数使用关键词(而不是逗号)来分隔参数。详情请参见表 9.11PostgreSQL 还提供了这些函数的版本,这些版本使用常规函数调用语法(参见表 9.12)。

表 9.11. SQL二进制字符串函数和运算符

函数/运算符

描述

示例

bytea || byteabytea

连接两个二进制字符串。

'\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

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

返回 bytes 中指定 substring 的第一个起始索引,如果不存在则返回零。

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 个字节后停止(如果已指定)。至少提供 startcount 中的一个。

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 中。表中部分函数在内部用于实现SQL- 表 9.11 中列出的标准字符串函数。

表 9.12 其他二进制字符串函数

函数

描述

示例

bit_count ( bytes bytea ) → bigint

返回二进制字符串中已设置的位数(又称为 计数位)。

bit_count('\x1234567890'::bytea)15

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

计算 binary string 的 MD5 哈希,结果以十六进制形式输出。

md5('Th\000omas'::bytea)8ab2d3c9689aaf18​b4958c334c82d8b1

set_bit ( bytes bytea, n bigint, newvalue integer ) → bytea

将二进制字符串中 第 n 位 bit 设置为 newvalue

set_bit('\x1234567890'::bytea, 30, 0)\x1234563890

set_byte ( bytes bytea, n integer, newvalue integer ) → bytea

将二进制字符串中 第 n 位 byte 设置为 newvalue

set_byte('\x1234567890'::bytea, 4, 64)\x1234567840

sha224 ( bytea ) → bytea

计算 binary string 的 SHA-224 哈希

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

sha256 ( bytea ) → bytea

计算 binary string 的 SHA-256 哈希

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

sha384 ( bytea ) → bytea

计算 binary string 的 SHA-384 哈希

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

sha512 ( bytea ) → bytea

计算 binary string 的 SHA-512 哈希

sha512('abc'::bytea)\xddaf35a193617abacc417349ae204131​12e6fa4e89a97ea20a9eeee64b55d39a​2192992a274fc1a836ba3c23a3feebbd​454d4423643ce80e2a9ac94fa54ca49f

substr ( bytes bytea, start integer [, count integer ] ) → bytea

bytesstart 第 'th' 字节开始提取子字符串,如果指定了 count 字节的话,则继续提取 count 个字节。(与 substring(bytes from start for count) 相同。)

substr('\x1234567890'::bytea, 3, 2)\x5678


函数 get_byteset_byte 将二进制字符串的第一个字节编号为 0。函数 get_bitset_bit 将每个字节内的比特从右往左进行编号;例如,比特 0 是第一个字节的最低有效比特,比特 15 是第二个字节的最高有效比特。

出于历史原因,函数 md5 返回类型为 text 的经过 16 进制编码的值,而 SHA-2 函数返回类型为 bytea 的值。使用函数 encodedecode 在两者之间进行转换。例如,编写 encode(sha256('abc'), 'hex') 以获取经过 16 进制编码的文本表示形式,或 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 值为: base64escapehex

encode('123\000\001', 'base64')MTIzAAE=

decode ( string text, format text ) → bytea

从文本表示形式解码二进制数据;受支持的 format 值与 encode 相同。

decode('MTIzAAE=', 'base64')\x3132330001


encodedecode 函数支持以下文本格式

base64 #

base64 格式为 RFC 2045 第 6.8 节 的格式。按照RFC,编码行以 76 个字符为分割。但是,仅仅换行符用于换行,而不是 MIME CRLF 换行符标记。当 decode 函数提供无效的 base64 数据(包括不正确的尾部填充)时,此函数将忽略回车、换行符、空格和制表符。否则会引发错误。

转义 #

escape 格式将零字节和高位字节转换为八进制转义序列 (\nnn),并将反斜杠加倍。其他字节值被直表示。如果反斜杠后面没有跟随第二个反斜杠或三个八进制数字,decode 函数会引发错误;它接受其他字节值不作更改。

十六进制 #

hex 格式将每 4 位数据表示为一个十六进制数字,从 0f,先写入每个字节的高位数字。 encode 函数小写输出 a-f 十六进制数字。由于数据最小单位为 8 位,encode 总是返回偶数个字符。 decode 函数接受大写或小写的 a-f 字符。当 decode 接收无效十六进制数据时(包括接收奇数个字符),它会引发错误。

还请参阅 第 9.21 节 中的聚合函数 string_agg 以及 第 33.4 节 中的大型对象函数。