2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 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.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

返回指定 substringbytes 中的第一個起始索引,如果不存在則返回零。

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 個位元組開始(如果指定了 start),並以 count 位元組結束(如果指定了 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 中找到。其中一些函式用於內部實現表 9.11 中列出的標準字串函式。SQL- 標準字串函式(如表 9.11 所示)的內部實現。

表 9.12. 其他二進位制字串函式

函式

描述

示例

bit_count ( bytes bytea ) → 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 ( 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 雜湊值,結果以十六進位制表示。

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 雜湊值

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

sha256 ( bytea ) → bytea

計算二進位制字串的 SHA-256 雜湊值

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

sha384 ( bytea ) → bytea

計算二進位制字串的 SHA-384 雜湊值

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

sha512 ( bytea ) → bytea

計算二進位制字串的 SHA-512 雜湊值

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_byteset_byte 將二進位制字串的第一個位元組編號為 0。函式 get_bitset_bit 將每個位元組內的位從右側開始編號;例如,位 0 是第一個位元組的最低有效位,位 15 是第二個位元組的最高有效位。

出於歷史原因,函式 md5 返回型別為 text 的十六進位制編碼值,而 SHA-2 函式返回型別為 bytea。使用 encodedecode 函式在這兩者之間進行轉換。例如,要獲取十六進位制編碼的文字表示,可以寫入 encode(sha256('abc'), 'hex');要獲取 bytea 值,可以寫入 decode(md5('abc'), 'hex')

不同字元集(編碼)之間的字串轉換函式,以及將任意二進位制資料表示為文字形式的函式,請參閱 表 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 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 位表示為一個十六進位制數字,從 0f,並先寫入每個位元組的高位數字。 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 節 中的大型物件函式。

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符之處或需要進一步澄清之處,請使用 此表格 報告文件問題。