本节介绍用于检查和操作二进制字符串(即 bytea 类型的值)的函数和运算符。其中许多在目的和语法上都与上一节描述的文本字符串函数等效。
  SQL定义了一些使用关键字而不是逗号分隔参数的字符串函数。详情请参阅 表 9.11。PostgreSQL 还提供了这些函数的版本,它们使用常规的函数调用语法(参见 表 9.12)。
  
    表 9.11. SQL二进制字符串函数和运算符
    
      
        
          
        
        
          
            | 函数/运算符 描述 示例 | 
        
        
          
            |  bytea||bytea→bytea 连接两个二进制字符串。 '\x123456'::bytea || '\x789a00bcde'::bytea→\x123456789a00bcde
 | 
          
            |  bit_length(bytea) →integer 返回二进制字符串中的位数(octet_length的 8 倍)。 bit_length('\x123456'::bytea)→24
 | 
          
            |  btrim(bytesbytea,bytesremovedbytea) →bytea 从 bytes的开头和结尾移除仅包含bytesremoved中字节的最长字符串。 btrim('\x1234567890'::bytea, '\x9012'::bytea)→\x345678
 | 
          
            |  ltrim(bytesbytea,bytesremovedbytea) →bytea 从 bytes的开头移除仅包含bytesremoved中字节的最长字符串。 ltrim('\x1234567890'::bytea, '\x9012'::bytea)→\x34567890
 | 
          
            |  octet_length(bytea) →integer 返回二进制字符串中的字节数。 octet_length('\x123456'::bytea)→3
 | 
          
            |  overlay(bytesbyteaPLACINGnewsubstringbyteaFROMstartinteger[FORcountinteger] ) →bytea 用 newsubstring替换bytes中从第start个字节开始、长度为count字节的子字符串。如果省略count,则默认为newsubstring的长度。 overlay('\x1234567890'::bytea placing '\002\003'::bytea from 2 for 3)→\x12020390
 | 
          
            |  position(substringbyteaINbytesbytea) →integer 返回指定 substring在bytes中的第一个起始索引,如果不存在则返回零。 position('\x5678'::bytea in '\x1234567890'::bytea)→3
 | 
          
            |  rtrim(bytesbytea,bytesremovedbytea) →bytea 从 bytes的结尾移除仅包含bytesremoved中字节的最长字符串。 rtrim('\x1234567890'::bytea, '\x9012'::bytea)→\x12345678
 | 
          
            |  substring(bytesbytea[FROMstartinteger] [FORcountinteger] ) →bytea 提取 bytes中从第start个字节开始(如果指定了start),并以count字节结束(如果指定了count)的子字符串。至少提供start和count中的一个。 substring('\x1234567890'::bytea from 3 for 2)→\x5678
 | 
          
            |  trim( [LEADING|TRAILING|BOTH]bytesremovedbyteaFROMbytesbytea) →bytea 从 bytes的开头、结尾或两端(默认是BOTH)移除仅包含bytesremoved中字节的最长字符串。 trim('\x9012'::bytea from '\x1234567890'::bytea)→\x345678
 | 
          
            | trim( [LEADING|TRAILING|BOTH] [FROM]bytesbytea,bytesremovedbytea) →bytea
 这是 trim()的非标准语法。 trim(both from '\x1234567890'::bytea, '\x9012'::bytea)→\x345678
 | 
        
      
     
   
  其他二进制字符串操作函数可在 表 9.12 中找到。其中一些函数用于内部实现表 9.11 中列出的标准字符串函数。SQL- 标准字符串函数(如表 9.11 所示)的内部实现。
  
    表 9.12. 其他二进制字符串函数
    
      
        
          
        
        
          
            | 函数 描述 示例 | 
        
        
          
            |   bit_count(bytesbytea) →bigint 返回二进制字符串中设置为 1 的位数(也称为“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(bytesbytea,nbigint) →integer 从二进制字符串中提取第 n 位。 get_bit('\x1234567890'::bytea, 30)→1
 | 
          
            |  get_byte(bytesbytea,ninteger) →integer 从二进制字符串中提取第 n 个字节。 get_byte('\x1234567890'::bytea, 4)→144
 | 
          
            |    length(bytea) →integer 返回二进制字符串中的字节数。 length('\x1234567890'::bytea)→5
 | 
          
            | length(bytesbytea,encodingname) →integer
 假设二进制字符串是指定 encoding的文本,则返回其中的字符数。 length('jose'::bytea, 'UTF8')→4
 | 
          
            |  md5(bytea) →text 计算二进制字符串的 MD5 哈希值,结果以十六进制表示。 md5('Th\000omas'::bytea)→8ab2d3c9689aaf18b4958c334c82d8b1
 | 
          
            |  reverse(bytea) →bytea 反转二进制字符串中字节的顺序。 reverse('\xabcd'::bytea)→\xcdab
 | 
          
            |  set_bit(bytesbytea,nbigint,newvalueinteger) →bytea 将二进制字符串中的第 n 位设置为 newvalue。 set_bit('\x1234567890'::bytea, 30, 0)→\x1234563890
 | 
          
            |  set_byte(bytesbytea,ninteger,newvalueinteger) →bytea 将二进制字符串中的第 n 个字节设置为 newvalue。 set_byte('\x1234567890'::bytea, 4, 64)→\x1234567840
 | 
          
            |  sha224(bytea) →bytea 计算二进制字符串的 SHA-224 哈希值。 sha224('abc'::bytea)→\x23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
 | 
          
            |  sha256(bytea) →bytea 计算二进制字符串的 SHA-256 哈希值。 sha256('abc'::bytea)→\xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
 | 
          
            |  sha384(bytea) →bytea 计算二进制字符串的 SHA-384 哈希值。 sha384('abc'::bytea)→\xcb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
 | 
          
            |  sha512(bytea) →bytea 计算二进制字符串的 SHA-512 哈希值。 sha512('abc'::bytea)→\xddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
 | 
          
            |  substr(bytesbytea,startinteger[,countinteger] ) →bytea 提取 bytes中从第start个字节开始、长度为count字节(如果指定)的子字符串。(与substring(相同。)bytesfromstartforcount) 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');要获取 bytea 值,可以写入 decode(md5('abc'), 'hex')。
    不同字符集(编码)之间的字符串转换函数,以及将任意二进制数据表示为文本形式的函数,请参阅 表 9.13。对于这些函数,类型为 text 的参数或结果以数据库的默认编码表示,而类型为 bytea 的参数或结果以由另一个参数命名的编码表示。
  
    表 9.13. 文本/二进制字符串转换函数
    
      
        
          
        
        
          
            | 函数 描述 示例 | 
        
        
          
            |  convert(bytesbytea,src_encodingname,dest_encodingname) →bytea 将表示 src_encoding编码文本的二进制字符串转换为dest_encoding编码的二进制字符串(有关可用转换,请参阅 第 23.3.4 节)。 convert('text_in_utf8', 'UTF8', 'LATIN1')→\x746578745f696e5f75746638
 | 
          
            |  convert_from(bytesbytea,src_encodingname) →text 将表示 src_encoding编码文本的二进制字符串转换为数据库编码的text(有关可用转换,请参阅 第 23.3.4 节)。 convert_from('text_in_utf8', 'UTF8')→text_in_utf8
 | 
          
            |  convert_to(stringtext,dest_encodingname) →bytea 将 text字符串(以数据库编码表示)转换为dest_encoding编码的二进制字符串(有关可用转换,请参阅 第 23.3.4 节)。 convert_to('some_text', 'UTF8')→\x736f6d655f74657874
 | 
          
            |  encode(bytesbytea,formattext) →text 将二进制数据编码为文本表示;支持的 format值包括:base64、escape、hex。 encode('123\000\001', 'base64')→MTIzAAE=
 | 
          
            |  decode(stringtext,formattext) →bytea 将二进制数据从文本表示解码;支持的 format值与encode相同。 decode('MTIzAAE=', 'base64')→\x3132330001
 | 
        
      
     
   
  encode 和 decode 函数支持以下文本格式:
  
    
      - base64  #
- 
        base64格式符合 RFC 2045 Section 6.8。根据 MIME 标准,编码行在 76 个字符处换行。但是,在行尾使用换行符而不是 MIME 的 CRLF 换行符。decode函数会忽略回车符、换行符、空格和制表符。否则,当decode收到无效的 base64 数据时会引发错误,包括尾部填充不正确的情况。RFC,编码后的行在 76 个字符处中断。但不是 MIME 的 CRLF 换行符,而只是使用换行符作为行尾。decode函数会忽略回车符、换行符、空格和制表符。否则,当decode收到无效的 base64 数据时,将引发错误 — 包括尾部填充不正确的情况。
 
- escape  #
- 
        escape格式将零字节和高位设置为 1 的字节转换为八进制转义序列(\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 节 中的大型对象函数。