PostgreSQL 二進制數(shù)據(jù)類型

2021-08-26 16:28 更新
8.4.1. bytea的十六進制格式
8.4.2. bytea的轉義格式

bytea數(shù)據(jù)類型允許存儲二進制串,參見表 8.6。

表 8.6. 二進制數(shù)據(jù)類型

名字存儲尺寸描述
bytea1或4字節(jié)外加真正的二進制串變長二進制串

二進制串是一個八位位組(或字節(jié))的序列。 二進制串和字符串的區(qū)別有兩個: 首先,二進制串明確允許存儲零值的字節(jié)以及其它不可打印的字節(jié)(通常是位于十進制范圍32到126之外的字節(jié))。 字符串不允許零字節(jié),并且也不允許那些對于數(shù)據(jù)庫的選定字符集編碼是非法的任何其它字節(jié)值或者字節(jié)值序列。 第二,對二進制串的操作會處理實際上的字節(jié),而字符串的處理和取決于區(qū)域設置。 簡單說,二進制字串適用于存儲那些程序員認為是裸字節(jié)的數(shù)據(jù),而字符串適合存儲文本。

bytea類型支持兩種用于輸入和輸出的格式:十六進制格式和PostgreSQL的歷史的轉義格式。在輸入時這兩種格式總是會被接受。輸出格式則取決于配置參數(shù)bytea_output,其默認值為十六進制(注意十六進制格式是在PostgreSQL 9.0中被引入的,早期的版本和某些工具無法理解它)。

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

8.4.1. bytea的十六進制格式

十六進制格式將二進制數(shù)據(jù)編碼為每個字節(jié)2個十六進制位,最高有效位在前。整個串以序列\x開頭(用以和轉義格式區(qū)分)。在某些情景中,開頭的反斜線可能需要通過雙寫來轉義,詳見(see 第 4.1.2.1 節(jié))。 作為輸入,十六進制位可以是大寫也可以是小寫,在位對之間可以有空白(但是在位對內部以及開頭的\x序列中不能有空白)。十六進制格式和很多外部應用及協(xié)議相兼容,并且其轉換速度要比轉義格式更快,因此人們更愿意用它。

例子:

SELECT '\xDEADBEEF';

8.4.2. bytea的轉義格式

轉義格式是bytea類型的傳統(tǒng)PostgreSQL格式。它采用將二進制串表示成ASCII字符序列的方法,而將那些無法用ASCII字符表示的字節(jié)轉換成特殊的轉義語句。從應用的角度來看,如果將字節(jié)表示為字符有意義,那么這種表示將很方便。但是在實際中,這常常是令人困擾的,因為它使二進制串和字符串之間的區(qū)別變得模糊,并且這種特別的轉義機制也有點難于處理。因此這種格式可能會在大部分新應用中避免使用。

在轉義模式下輸入bytea值時,某些值的字節(jié)必須被轉義,而所有的字節(jié)值都可以被轉義。通常,要轉義一個字節(jié),需要把它轉換成與它的三位八進制值, 并且前導一個反斜線。反斜線本身(十進制字節(jié)值92)也可以用雙寫的反斜線表示。表 8.7顯示了必須被轉義的字符,并給出了可以使用的替代轉義序列。

表 8.7. bytea文字轉義字節(jié)

十進制字節(jié)值描述轉義輸入表示例子十六進制表示
00字節(jié)'\000''\000'::bytea\x00
39單引號'''''\047'''''::bytea\x27
92反斜線'\\''\134''\\'::bytea\x5c
0到31和127到255不可打印的字節(jié)'\xxx'(八進制值)'\001'::bytea\x01

轉義不可打印的字節(jié)的要求取決于區(qū)域設置。在某些實例中,你可以不理睬它們,讓它們保持未轉義的狀態(tài)。

如表 8.7中所示,要求單引號必須寫兩次的原因對任何SQL命令中的字符串常量都是一樣的。 文字解析器消耗最外層的單引號,并縮減成對的單引號為一個普通數(shù)據(jù)字符。 bytea輸入函數(shù)看到的只是一個單引號,它將其視為普通數(shù)據(jù)字符。 但是,bytea輸入函數(shù)將反斜杠視為特殊字符,表 8.7中顯示的其他行為由該函數(shù)實現(xiàn)。

在某些情況下,反斜杠必須加倍,如上所示,因為通用的字符串文字解析器也會 將一對反斜杠減少為一個數(shù)據(jù)字符;請參閱第 4.1.2.1 節(jié)。

Bytea字節(jié)默認被輸出為hex格式。如果你把bytea_output改為escape不可打印的字節(jié)會被轉換成與之等效的三位八進制值并且前置一個反斜線。大部分可打印的字節(jié)被輸出為它們在客戶端字符集中的標準表示形式,例如:

SET bytea_output = 'escape';

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

十進制值為92(反斜線)的字節(jié)在輸出時被雙寫。詳情請見表 8.8。

表 8.8. bytea輸出轉義字節(jié)

十進制字節(jié)值描述轉義的輸出表示例子輸出結果
92反斜線\\'\134'::bytea\\
0到31和127到255不可打印的字節(jié)\xxx(八進制值)'\001'::bytea\001
32到126可打印的字節(jié)客戶端字符集表示'\176'::bytea~

根據(jù)你使用的PostgreSQL前端,你在轉義和未轉義bytea串方面可能需要做額外的工作。例如,如果你的接口自動翻譯換行和回車,你可能也不得不轉義它們。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號