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

本节介绍用于检查和操作二进制字符串(即类型值)的函数和运算符二进制数据。其中许多函数在用途和语法上与上一节中描述的文本字符串函数等效。

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

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

功能/操作员

描述

例子
二进制数据 || 二进制数据二进制数据

连接两个二进制字符串。

“\x123456”:bytea | |“\x789a00bcde”::bytea\X123456789A000BCDE
比特长度(二进制数据) →整数

返回二进制字符串中的位数(8倍于八位组长度).

bit_length('\x123456'::bytea)24
八位字节长度 ( 拜茶 ) → 整数

返回二进制字符串中的字节数。

八位字节长度('\x123456'::bytea)3
覆盖 ( 字节 拜茶 配售 新子串 拜茶 开始 整数 [ 为了 数数 整数 ] ) → 拜茶

替换子串*字节开始于开始'第一个字节并扩展为数数字节与新子串.如果数数省略,默认为长度新子串*.

覆盖('\x1234567890'::bytea 将 '\002\003'::bytea 从 2 到 3)\x12020390
位置(子串 拜茶 字节 拜茶) →整数

返回指定的第一个起始索引*子串之内字节*,如果不存在,则为零。

位置('\x5678'::bytea 在'\x1234567890'::bytea)3
子串(字节 拜茶 [ 开始 整数 ][ for count integer ]) →拜茶

提取子串*字节开始于开始'如果指定了第一个字节,则在之后停止数数如果指定了字节。提供至少一项开始数数*.

substring('\x1234567890'::bytea 从 3 到 2)\x5678
修剪( [领导 尾随 两个都]删除的字节 拜茶 字节 拜茶 ) → 拜茶

删除仅包含出现在*删除的字节从开始、结束或两端(两个都是默认值)的字节*.

trim('\x9012'::bytea 来自 '\x1234567890'::bytea)\x345678
修剪 ( [ 领导 尾随 两个都 ] [ ] 字节 拜茶, 删除的字节 拜茶 ) → 拜茶

这是的非标准语法trim().

修剪(均来自“\x1234567890”::字节茶“\x9012”::字节茶)\x345678

其他二进制字符串操作函数可用,并在中列出表9.12。其中一些函数在内部用于实现中列出的SQL标准字符串函数表9.11.

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

作用

描述

例子
比特计数(字节 二进制数据) →比基特

返回二进制字符串(也称为“popcount”)中设置的位数。

位计数('\x1234567890'::字节)15
btrim(字节 二进制数据,字节删除 二进制数据 ) → 二进制数据

删除仅包含中出现的字节的最长字符串*字节删除自始至终字节*.

btrim(“\x1234567890':字节茶,\x9012'::字节茶)\x345678
吃点东西 ( 字节 二进制数据, n 比基特 ) → 整数

摘录二进制字符串中的位。

获取位('\x1234567890'::bytea,30)1.
获取字节 ( 字节 二进制数据, n 整数 ) → 整数

摘录二进制字符串中的字节。

获取字节('\x1234567890'::bytea,4)144
( 二进制数据 ) → 整数

返回二进制字符串中的字节数。

长度('\x1234567890'::字节)5.
( 字节 二进制数据, 编码 名称 ) → 整数

返回二进制字符串中的字符数,假设它是给定字符串中的文本*编码*.

长度('jose'::bytea,'UTF8')4.
ltrim ( 字节 二进制数据, 字节删除 二进制数据 ) → 二进制数据

删除仅包含中出现的字节的最长字符串*字节删除从一开始字节*.

ltrim(“\x1234567890':bytea”,\x9012':bytea)\x34567890
md5 ( 二进制数据 ) → 文本

计算MD5搞砸二进制字符串,结果用十六进制写成。

md5('Th\000OMA':bytea)8ab2d3c9689aaf18​b4958c334c82d8b1
rtrim ( 字节 二进制数据, 字节删除 二进制数据 ) → 二进制数据

删除仅包含中出现的字节的最长字符串*字节删除字节*.

rtrim(“\x1234567890':字节茶,\x9012'::字节茶)\x12345678
设位 ( 字节 二进制数据, n 比基特, 新价值 整数 ) → 二进制数据

设置二进制字符串中的位到*新价值*.

设置位('\x1234567890'::字节,30,0)\x1234563890
设置字节 ( 字节 二进制数据, n 整数, 新价值 整数 ) → 二进制数据

设置二进制字符串中的字节到*新价值*.

设置字节('\x1234567890'::bytea,4,64)\x1234567840
sha224 ( 二进制数据 ) → 二进制数据

计算SHA-224搞砸二进制字符串的。

sha224('abc':bytea)\x23097d223405d8228642a477bda2​55b32aadbce4bda0b3f7e36c9da7
sha256 ( 二进制数据 ) → 二进制数据

计算SHA-256搞砸二进制字符串的。

sha256('abc':bytea)\xba7816bf8f01cfea414140de5dae2223​b00361a396177a9cb410ff61f20015ad
sha384 ( 二进制数据 ) → 二进制数据

计算SHA-384搞砸二进制字符串的。

sha384('abc':bytea)\xcb00753f45a35e8bb5a03d699ac65007​272C32AB0ED1631A8B605A43FF5BED​8086072ba1e7cc2358baeca134c825a7
sha512 ( 二进制数据 ) → 二进制数据

计算SHA-512搞砸二进制字符串的。

sha512('abc':bytea)\xddaf35a193617abacc417349ae204131​12E6FA4E89A97EA20A9EE64B55D39A​2192992A274FC1A836BA3C23A3FEEBD​454d4423643ce80e2a9ac94fa54ca49f
substr ( 字节 二进制数据, 开始 整数 [, 计数 整数 ] ) → 二进制数据

提取*字节开始'第个字节,并扩展为计数*字节(如果指定)。(与子串(*字节*来自*开始*因为*计数*).)

substr(“\x1234567890”::bytea,3,2)\x5678

功能获取字节设置字节将二进制字符串的第一个字节编号为字节0.功能吃点东西设位从每个字节的右边开始对位进行编号;例如,位0是第一个字节的最低有效位,位15是第二个字节的最高有效位。

出于历史原因md5返回类型为的十六进制编码值文本而SHA-2函数返回类型二进制数据.使用这些功能编码解码在两者之间转换。比如写编码(sha256('abc'),'hex')获取十六进制编码的文本表示,或解码(md5('abc'),'hex')得到一个二进制数据价值

中显示了用于在不同字符集(编码)之间转换字符串以及以文本形式表示任意二进制数据的函数表9.13.对于这些函数,类型为的参数或结果文本以数据库的默认编码表示,而二进制数据在另一个参数命名的编码中。

表9.13.文本/二进制字符串转换函数

作用

描述

例子
转换 ( 字节 二进制数据, src_编码 名称, dest_编码 名称 ) → 二进制数据

转换表示编码中文本的二进制字符串*src_编码对二进制字符串进行编码dest_编码*(见第24.3.4节对于可用的转换)。

转换('text_in_utf8'、'utf8'、'LATIN1')\X7465787445F696E5F75746638
把你从 ( 字节 二进制数据, src_编码 名称 ) → 文本

转换表示编码中文本的二进制字符串*src_编码*到文本在数据库编码中(请参见第24.3.4节对于可用的转换)。

转换自('text_in_utf8'、'utf8')文本_in_utf8
转化为 ( 一串 文本, dest_编码 名称 ) → 二进制数据

皈依文本字符串(在数据库编码中)转换为在编码中编码的二进制字符串*dest_编码*(见第24.3.4节对于可用的转换)。

将_转换为('some_text'、'UTF8')\x736f6d655f74657874
编码 ( 字节 二进制数据, 总体安排 文本 ) → 文本

将二进制数据编码为文本表示;支持*总体安排*价值观包括:base64, 逃跑, 十六进制.

编码('123\000\001','base64')姆蒂扎=
解码 ( 一串 文本, 总体安排 文本 ) → 二进制数据

从文本表示中解码二进制数据;支持*总体安排*值与的值相同编码.

解码('MTIzAAE=','base64')\x3132330001

这个编码解码函数支持以下文本格式:

base64

这个base64格式是RFC 2045第6.8节 (opens new window).根据RFC,编码行在76个字符处断开。然而,除了MIME CRLF行尾标记,行尾标记只使用换行符。这个解码函数忽略回车符、换行符、空格和制表符。否则,当解码提供的base64数据无效-包括尾随填充不正确时。

逃跑

这个逃跑format将零字节和高位设置的字节转换为八进制转义序列(\nnn),它会加倍反斜杠。其他字节值按字面表示。这个解码如果反斜杠后面没有第二个反斜杠或三个八进制数字,函数将引发错误;它接受其他不变的字节值。

十六进制

这个十六进制格式将每4位数据表示为一个十六进制数字,0通过f,首先写入每个字节的高阶数字。这个编码函数输出A.-f小写的十六进制数字。因为数据的最小单位是8位,所以返回的字符数总是偶数编码这个解码函数接受A.-f大写或小写字符。当解码给出的十六进制数据无效,包括奇数字符。

另请参见聚合函数字符串_agg在里面第9.21节而大对象函数第35.4节.