支援的版本:目前 (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 中引入的;較早的版本和某些工具無法理解它。)

TheSQL標準定義了一種不同的二進位字串類型,稱為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 逸出格式 #

逸出格式是bytea類型的傳統PostgreSQL格式。它採用將二進位字串表示為一連串 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 字串。例如,如果您的介面自動轉換換行符號和歸位符號,您可能還需要逸出這些字元。

提交更正

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