W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
bytea
的十六進制格式bytea
的轉義格式
bytea
數(shù)據(jù)類型允許存儲二進制串,參見表 8.6。
表 8.6. 二進制數(shù)據(jù)類型
名字 | 存儲尺寸 | 描述 |
---|---|---|
bytea | 1或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ù)和操作符大多一樣。
bytea
的十六進制格式
“十六進制”格式將二進制數(shù)據(jù)編碼為每個字節(jié)2個十六進制位,最高有效位在前。整個串以序列\x
開頭(用以和轉義格式區(qū)分)。在某些情景中,開頭的反斜線可能需要通過雙寫來轉義,詳見(see 第 4.1.2.1 節(jié))。 作為輸入,十六進制位可以是大寫也可以是小寫,在位對之間可以有空白(但是在位對內部以及開頭的\x
序列中不能有空白)。十六進制格式和很多外部應用及協(xié)議相兼容,并且其轉換速度要比轉義格式更快,因此人們更愿意用它。
例子:
SELECT '\xDEADBEEF';
bytea
的轉義格式
“轉義”格式是bytea
類型的傳統(tǒng)PostgreSQL格式。它采用將二進制串表示成ASCII字符序列的方法,而將那些無法用ASCII字符表示的字節(jié)轉換成特殊的轉義語句。從應用的角度來看,如果將字節(jié)表示為字符有意義,那么這種表示將很方便。但是在實際中,這常常是令人困擾的,因為它使二進制串和字符串之間的區(qū)別變得模糊,并且這種特別的轉義機制也有點難于處理。因此這種格式可能會在大部分新應用中避免使用。
在轉義模式下輸入bytea
值時,某些值的字節(jié)必須被轉義,而所有的字節(jié)值都可以被轉義。通常,要轉義一個字節(jié),需要把它轉換成與它的三位八進制值, 并且前導一個反斜線。反斜線本身(十進制字節(jié)值92)也可以用雙寫的反斜線表示。表 8.7顯示了必須被轉義的字符,并給出了可以使用的替代轉義序列。
表 8.7. bytea
文字轉義字節(jié)
十進制字節(jié)值 | 描述 | 轉義輸入表示 | 例子 | 十六進制表示 |
---|---|---|---|---|
0 | 0字節(jié) | '\000' | '\000'::bytea | \x00 |
39 | 單引號 | '''' 或'\047' | ''''::bytea | \x27 |
92 | 反斜線 | '\\' 或'\134' | '\\'::bytea | \x5c |
0到31和127到255 | “不可打印的”字節(jié) | '\ (八進制值) | '\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é) | \ (八進制值) | '\001'::bytea | \001 |
32到126 | “可打印的”字節(jié) | 客戶端字符集表示 | '\176'::bytea | ~ |
根據(jù)你使用的PostgreSQL前端,你在轉義和未轉義bytea
串方面可能需要做額外的工作。例如,如果你的接口自動翻譯換行和回車,你可能也不得不轉義它們。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: