本節描述了用於檢查和操作二進位字串的函數和運算子,也就是 bytea
類型的值。它們之中的許多函數,在目的和語法上,都等同於上一節中描述的文字字串函數。
SQL定義了一些使用關鍵字而不是逗號來分隔參數的字串函數。詳情請參閱表 9.11。PostgreSQL 也提供了這些函數的版本,它們使用常規函數調用語法(參閱表 9.12)。
表 9.11. SQL二進位字串函數和運算子
函數/運算子
描述
範例
|
bytea || bytea → bytea
連接兩個二進位字串。
'\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
傳回指定的 substring 在 bytes 內首次出現的起始索引,如果不存在則傳回零。
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 個位元組後停止。 至少提供 start 和 count 其中之一。
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) → 8ab2d3c9689aaf18b4958c334c82d8b1
|
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) → \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 ( bytes bytea , start integer [, count integer ] ) → bytea
從 bytes 的第 start 個位元組開始提取子字串,並延伸 count 個位元組(如果指定)。(與 substring(bytes from start for count ) 相同。)
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')
以取得十六進制編碼的文字表示形式,或寫入 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 值為:base64 、escape 、hex 。
encode('123\000\001', 'base64') → MTIzAAE=
|
decode ( string text , format text ) → bytea
從文字表示形式解碼二進位資料;支援的 format 值與 encode 相同。
decode('MTIzAAE=', 'base64') → \x3132330001
|
函數 encode
和 decode
支援以下文字格式
- base64 #
-
base64
格式是 RFC 2045 第 6.8 節 的格式。按照RFC的規定,編碼的行在 76 個字元處中斷。但是,終端標記僅使用換行符號,而不是 MIME CRLF 終端標記。當提供無效的 base64 資料(包括尾隨填充不正確時),decode
函數會忽略回車符、換行符號、空格和制表符。否則,會引發錯誤。
- escape #
-
escape
格式將零位元組和高位元組設定的位元組轉換為八進制跳脫序列 (\
nnn
),並且它會使反斜線加倍。其他位元組值以文字形式表示。如果反斜線後麵沒有第二個反斜線或三個八進制數字,decode
函數將引發錯誤;它接受其他未更改的位元組值。
- hex #
-
hex
格式將資料的每 4 位元表示為一個十六進位數字,從 0
到 f
,並首先寫入每個位元組的高位數字。 encode
函式會以小寫形式輸出 a
-f
的十六進位數字。 因為資料的最小單位是 8 位元,所以 encode
總是傳回偶數個字元。decode
函式接受大寫或小寫的 a
-f
字元。當 decode
收到無效的十六進位資料時 (包括收到奇數個字元時),會引發錯誤。
另請參閱第 9.21 節中的聚合函數 string_agg
,以及第 33.4 節中的大型物件函數。