支援的版本:目前 (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

傳回二進位字串中的位元數(8 倍於 octet_length)。

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 個位元組開始;如果指定了計數,則在 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

傳回二進位字串中設定的位元數(也稱為popcount)。

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

計算二進位字串的 MD5 雜湊,結果以十六進位寫入。

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

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') 以取得十六進制編碼的文字表示形式,或寫入 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 終端標記。當提供無效的 base64 資料(包括尾隨填充不正確時),decode 函數會忽略回車符、換行符號、空格和制表符。否則,會引發錯誤。

escape #

escape 格式將零位元組和高位元組設定的位元組轉換為八進制跳脫序列 (\nnn),並且它會使反斜線加倍。其他位元組值以文字形式表示。如果反斜線後麵沒有第二個反斜線或三個八進制數字,decode 函數將引發錯誤;它接受其他未更改的位元組值。

hex #

hex 格式將資料的每 4 位元表示為一個十六進位數字,從 0f,並首先寫入每個位元組的高位數字。 encode 函式會以小寫形式輸出 a-f 的十六進位數字。 因為資料的最小單位是 8 位元,所以 encode 總是傳回偶數個字元。decode 函式接受大寫或小寫的 a-f 字元。當 decode 收到無效的十六進位資料時 (包括收到奇數個字元時),會引發錯誤。

另請參閱第 9.21 節中的聚合函數 string_agg,以及第 33.4 節中的大型物件函數。

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表格來報告文件問題。