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

8.4. 二進位制資料型別 #

bytea 資料型別允許儲存二進位制字串;請參閱 表 8.6

表 8.6. 二進位制資料型別

名稱 儲存大小 描述
bytea 1 或 4 位元組加上實際的二進位制字串 變長二進位制字串

二進位制字串是位元組(或八位位元組)序列。二進位制字串與字元字串的區分方式有兩種。首先,二進位制字串專門允許儲存值為零和其他不可列印的位元組(通常是十進位制範圍 32 到 126 之外的位元組)。字元字串不允許零位元組,並且根據資料庫選定的字元集編碼,不允許任何其他位元組值或無效的位元組值序列。其次,對二進位制字串的操作處理的是實際位元組,而對字元字串的處理則取決於區域設定。簡而言之,二進位制字串適用於儲存程式設計師認為是原始位元組的資料,而字元字串則適用於儲存文字。

bytea 型別支援兩種輸入輸出格式:“十六進位制”格式和 PostgreSQL 傳統的“轉義”格式。這兩種格式在輸入時總是被接受的。輸出格式取決於配置引數 bytea_output;預設是十六進位制。 (請注意,十六進位制格式是在 PostgreSQL 9.0 中引入的;早期版本和某些工具不理解它。)

SQL標準定義了一種不同的二進位制字串型別,稱為 BLOBBINARY LARGE OBJECT。其輸入格式與 bytea 不同,但提供的函式和運算子大部分相同。

8.4.1. bytea 十六進位制格式 #

“十六進位制”格式將二進位制資料編碼為每位元組 2 個十六進位制數字,高位在前。整個字串前面是序列 \x(以區別於轉義格式)。在某些上下文中,開頭的反斜槓可能需要透過加倍來轉義(參見 第 4.1.2.1 節)。對於輸入,十六進位制數字可以是大小寫字母,並且數字對之間允許有空格(但數字對內部或開頭的 \x 序列中不允許)。十六進位制格式與各種外部應用程式和協議相容,並且轉換速度通常比轉義格式快,因此推薦使用它。

示例:

SET bytea_output = 'hex';

SELECT '\xDEADBEEF'::bytea;
   bytea
------------
 \xdeadbeef

8.4.2. bytea 轉義格式 #

“轉義”格式是 PostgreSQL 傳統的 bytea 型別格式。它將二進位制字串表示為一系列 ASCII 字元,同時將不能表示為 ASCII 字元的位元組轉換為特殊的轉義序列。如果從應用程式的角度來看,將位元組表示為字元是有意義的,那麼這種表示可能很方便。但實際上它通常會引起混淆,因為它模糊了二進位制字串和字元字串之間的區別,並且選擇的特定轉義機制也有些笨拙。因此,對於大多數新應用程式,應避免使用此格式。

在輸入轉義格式的 bytea 值時,某些值的八位位元組必須被轉義,而所有八位位元組值可以被轉義。通常,要轉義一個八位位元組,將其轉換為其三位八進位制值,並在前面加上反斜槓。反斜槓本身(八位位元組十進位制值 92)也可以用雙反斜槓表示。表 8.7 顯示了必須轉義的字元,並給出了適用的替代轉義序列。

表 8.7. bytea 字面量轉義八位位元組

十進位制八位位元組值 描述 轉義輸入表示 示例: 十六進位制表示
0 零八位位元組 '\000' '\000'::bytea \x00
39 單引號 '''''\047' ''''::bytea \x27
92 反斜槓 '\\''\134' '\\'::bytea \x5c
0 至 31 和 127 至 255 不可列印八位位元組 '\xxx' (八進位制值) '\001'::bytea \x01

轉義不可列印八位位元組的要求取決於區域設定。在某些情況下,您可以省略它們而不進行轉義。

正如 表 8.7 中所示,單引號必須加倍的原因是,對於 SQL 命令中的任何字串字面量,都是如此。通用的字串字面量解析器會消耗最外層的單引號,並將成對的單引號減少為一個數據字元。bytea 輸入函式看到的是一個單引號,它將其視為普通資料字元。但是,bytea 輸入函式將反斜槓視為特殊字元,表 8.7 中顯示的其餘行為由該函式實現。

在某些上下文中,反斜槓必須加倍,這與上面所示的不同,因為通用的字串字面量解析器也會將成對的反斜槓減少為一個數據字元;請參見 第 4.1.2.1 節

Bytea 八位位元組預設以 hex 格式輸出。如果將 bytea_output 改為 escape,則不可列印的八位位元組會被轉換為其等效的三位八進位制值,並在前面加上一個反斜槓。大多數可列印的八位位元組以其在客戶端字元集中的標準表示形式輸出,例如:

SET bytea_output = 'escape';

SELECT 'abc \153\154\155 \052\251\124'::bytea;
     bytea
----------------
 abc klm *\251T

十進位制值為 92 的八位位元組(反斜槓)在輸出時會被加倍。詳細資訊請參見 表 8.8

表 8.8. bytea 輸出轉義八位位元組

十進位制八位位元組值 描述 轉義輸出表示 示例: 輸出結果
92 反斜槓 \\ '\134'::bytea \\
0 至 31 和 127 至 255 不可列印八位位元組 \xxx (八進位制值) '\001'::bytea \001
32 至 126 可列印八位位元組 客戶端字元集表示 '\176'::bytea ~

根據您使用的 PostgreSQL 前端,您可能需要在轉義和取消轉義 bytea 字串方面做額外的工作。例如,如果您的介面自動轉換換行符和回車符,您可能還需要對它們進行轉義。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的實際體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。