8.4. 二進制數據類型

bytea 數據類型允許存儲二進制字串. 參閱Table 8-6

Table 8-6. 二進制數據類型

名字存儲空間描述
bytea4 字節加上實際的二進制字串變長的二進制字串

二進制字串是一個字節數值的序列。 二進制字串和字符字串的區別有兩個:首先,二進制字串完全可以允許 存儲字節零值以及其它"不可打印的"字節。 第二,對二進制串的處理就是實際上的字節,而字符串的處理和編碼 取決于區域設置。

在輸入 bytea 數值的時候, 在一個 SQL 語句的文本串裡面, 你必須逃逸某些字節值(但 可以逃逸所有字節值) 通常,要逃逸一個字節值,需要把它的數值轉換成與其十進制字節值對應的三位八進制數字, 並且前導兩個反斜扛.有些八進制數值有可選的逃逸序列, 在 Table 8-7 中顯示, 同時給出了可選的逃逸序列。

Table 8-7. bytea 文本逃逸八進制

十進制數值描述輸入逃逸表現形式例子輸出形式
0 零的八進制 '\\000' select '\\000'::bytea; \000
39 單引號 '\'' 或者 '\\047' select '\''::bytea; '
92 反斜扛 '\\\\' 或者 '\\134' select '\\\\'::bytea; \\

請注意Table 8-7裡的每個例子都是剛好一個字節長,雖然字節零和反斜扛 輸出形式比一個字符要長.

你必須寫這麼多反斜槓的原因,如 Table 8-7 所示,是因為一個寫成字串文本的輸入字串必須 通過 PostgreSQL 服務器裡的兩個分析階段。 每個反斜槓對的第一個反斜槓會被字串文本分析其理解成一個逃逸字符而消耗掉, 剩下反斜槓對中的第二個。剩下的反斜槓被 bytea 輸入函數 當作一個三位八進制值或者是逃逸另外一個反斜槓的開始。 比如,一個傳遞給服務器的字串文本 '\\001' 在通過 字串分析器之後會成為 \001。而 \001 則發送給 bytea 輸入函數,在這裡它被轉換成一個十進制值為 1 的單個字節。請注意,省略字符不會被 bytea 特殊對待, 因此它遵循字串文本的普通規則。(又見 Section 4.1.2.1。)

Bytea 字節也在輸出中 逃逸的.通常,每個"不可打印"的字節值 都轉化成對應的前導反斜扛的三位八進制數值.大多數"可打印的" 字節值是以客戶端字符集的標準表現形式出現的.十進制值為 92 (反斜扛) 的字節有一個特殊的可選輸出形式.細節在 Table 8-8 裡描述.

Table 8-8. bytea 輸出逃逸序列

字節的十進制值描述逃逸的輸出形式例子輸出結果
92 反斜扛 \\ select '\\134'::bytea; \\
0 到 31 和 127 到 255 "不可打印"八進制字符 \xxx(octal value) select '\\001'::bytea; \001
32 到 126 "可打印"八進制字符 ASCII 表現形式 select '\\176'::bytea; ~

根據你使用的前端的不同,在逃不逃逸 bytea 字串的問題上 你可能有一些額外的工作要做.比如,如果你的接口自動轉換進行(發音:hang)和回車, 那你可能還要逃逸它們.

SQL 標準定義了一種不同的二進制字串類型, 叫做 BLOB 或者 BINARY LARGE OBJECT。 期輸入格式和 bytea 不同,但是提供的函數和操作符 大多一樣。