10.5. 二进制串函数和操作符

本节描述那些检查和操作二进制字符串的函数和操作符,这是类型bytea的值。 其中许多函数在用途和语法上都与上一节中描述的文本字符串函数等效。

SQL定义了一些使用关键字而不是逗号来分割参数的串函数。详情请见Table 10.11LightDB也提供了这些函数使用常规函数调用语法的版本(参阅Table 10.12)。

Table 10.11. SQL二进制串函数和操作符

函数/操作符

描述

例子

bytea || byteabytea

连接两个二进制字符串。

'\x123456'::bytea || '\x789a00bcde'::bytea\x123456789a00bcde

bit_length ( bytea ) → integer

返回二进制字符串中的位数 (8 倍于 octet_length).

bit_length('\x123456'::bytea)24

octet_length ( bytea ) → integer

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

octet_length('\x123456'::bytea)3

overlay ( bytes bytea PLACING newsubstring bytea FROM start integer [ FOR count integer ] ) → bytea

bytes的子字符串替换为newsubstring,该子字符串从start字节开始,并以count字节扩展。 如果忽略了count,则默认为newsubstring的长度。

overlay('\x1234567890'::bytea placing '\002\003'::bytea from 2 for 3)\x12020390

position ( substring bytea IN bytes bytea ) → integer

返回指定的substringbytes内的起始索引,如果不存在,则为零。

position('\x5678'::bytea in '\x1234567890'::bytea)3

substring ( bytes bytea [ FROM start integer ] [ FOR count integer ] ) → bytea

提取bytesstart字节开始的子字符串,如果指定了,并且在count字节之后停止,如果指定了的话。 至少提供startcount中的一个。

substring('\x1234567890'::bytea from 3 for 2)\x5678

trim ( [ BOTH ] bytesremoved bytea FROM bytes bytea ) → bytea

bytes的开始和结束处删除bytesremoved中只包含字节的最长字符串。

trim('\x9012'::bytea from '\x1234567890'::bytea)\x345678

trim ( [ BOTH ] [ FROM ] bytes bytea, bytesremoved bytea ) → bytea

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

trim(both from '\x1234567890'::bytea, '\x9012'::bytea)\x345678


还有一些二进制串处理函数可以使用,在Table 10.12列出。 其中有一些是在内部使用,用于实现Table 10.11列出的 SQL 标准串函数。

Table 10.12. 其他二进制串函数

函数

描述

例子

btrim ( bytes bytea, bytesremoved bytea ) → bytea

bytes的开始和结束处删除只包含bytesremoved中出现的字节的最长字符串

btrim('\x1234567890'::bytea, '\x9012'::bytea)\x345678

get_bit ( bytes bytea, n bigint ) → integer

从二进制字符串中提取 n'th 位。

get_bit('\x1234567890'::bytea, 30)1

get_byte ( bytes bytea, n integer ) → integer

从二进制字符串中提取 n'th 字节。

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

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

设置二进制字符串中的n'th位为newvalue

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

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

设置二进制字符串中的 n'th 字节到 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

start字节开始提取bytes的子字符串,并扩展为count字节,如果这是指定的。 (与 substring(bytesstartcount) 相同.)

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


函数get_byteset_byte把一个二进制串中的一个字节计数为字节 0。 函数get_bitset_bit在每一个字节中从右边起计数位; 例如位 0 是第一个字节的最低有效位,而位 15 是第二个字节的最高有效位。

由于历史原因,函数md5返回的是一个十六进制编码的text值,而SHA-2函数返回类型bytea。 可以使用函数encodedecode在两者之间转换。 例如encode(sha256('abc'),'hex')可以得到一个十六进制编码的文本表示,或者decode(md5('abc'), 'hex')得到一个bytea 值。

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

Table 10.13. Text/Binary String Conversion Functions

函数

描述

例子

convert ( bytes bytea, src_encoding name, dest_encoding name ) → bytea

将表示编码src_encoding的文本的二进制字符串转换为编码dest_encoding的二进制字符串 (适用的转换请参阅Section 22.3.4)。

convert('text_in_utf8', 'UTF8', 'LATIN1')\x746578745f696e5f75746638

convert_from ( bytes bytea, src_encoding name ) → text

将表示编码src_encoding的文本的二进制字符串转换为数据库编码中的text。 (适用的转换请参阅 Section 22.3.4 )。

convert_from('text_in_utf8', 'UTF8')text_in_utf8

convert_to ( string text, dest_encoding name ) → bytea

text字符串(数据库编码)转换为编码dest_encoding中编码的二进制字符串。 (适用的转换请参阅 Section 22.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


encodedecode 函数支持以下文本格式:

base64

base64格式是RFC 2045 Section 6.8。 根据RFC,编码的行被分割为76个字符。但是,作为MIME CRLF行结束标记的替代,只有换行符用于行结束。 decode函数忽略回车、换行、空格和制表符。 否则,当decode被提供了无效的base64数据—包括结尾填充不正确时。

escape

escape格式将零字节和设置了高位的字节转换为八进制转义序列(\nnn),并将反斜杠加倍。 其他字节值按字面意思表示。 decode函数如果反斜杠后面没有第二个反斜杠或三个八进制数字将引发错误;它接受其他未变化的字节值。

hex

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