二進制數(shù)據(jù)類型
本文介紹了二進制數(shù)據(jù)類型的定義及相關(guān)語法。
名稱 | 存儲大小 | 說明 |
BINARY | 二進制字符串的長度。 | 定長二進制字符串,取值范圍:1~8300。 |
BLOB | 實際二進制字符串加1字節(jié)(如果二進制字符串小于127字節(jié))或4字節(jié)(如果二進制字符串大于等于127字節(jié))。 | 可變長度的二進制字符串。 |
VARBINARY | 二進制字符串的長度。 | 可變長度的二進制字符串,取值范圍:1~8300。 |
BYTEA | 1或4字節(jié)加上實際的二進制字符串。 | 變長的二進制字符串。 |
二進制串是一個八位位組(或字節(jié))的序列。 二進制串和字符串的區(qū)別有兩個: 首先,二進制串明確允許存儲零值的字節(jié)以及其它“不可打印的”字節(jié)(通常是位于十進制范圍 32 到 126 之外的字節(jié))。 字符串不允許零字節(jié),并且也不允許那些對于數(shù)據(jù)庫的選定字符集編碼是非法的任何其它字節(jié)值或者字節(jié)值序列。 第二,對二進制串的操作會處理實際上的字節(jié),而字符串的處理和取決于區(qū)域設(shè)置。 簡單說,二進制字串適用于存儲那些程序員認為是“裸字節(jié)”的數(shù)據(jù),而字符串適合存儲文本。
bytea
類型支持兩種用于輸入和輸出的格式:“十六進制”格式和“轉(zhuǎn)義”格式。在輸入時這兩種格式總是會被接受。輸出格式則取決于配置參數(shù) bytea_output,其默認值為十六進制。
SQL 標準定義了一種不同的二進制串類型, 叫做BLOB
或者BINARY LARGE OBJECT
。其輸入格式和bytea
不同,但是提供的函數(shù)和操作符大多一樣。
bytea的十六進制格式
“十六進制”格式將二進制數(shù)據(jù)編碼為每個字節(jié) 2 個十六進制位,最高有效位在前。整個串以序列\x
開頭(用以和轉(zhuǎn)義格式區(qū)分)。在某些情景中,開頭的反斜線可能需要通過雙寫來轉(zhuǎn)義。 作為輸入,十六進制位可以是大寫也可以是小寫,在位對之間可以有空白(但是在位對內(nèi)部以及開頭的\x
序列中不能有空白)。十六進制格式和很多外部應(yīng)用及協(xié)議相兼容,并且其轉(zhuǎn)換速度要比轉(zhuǎn)義格式更快,因此人們更愿意用它。
例子:
select '\xDEADBEEF';
bytea的轉(zhuǎn)義格式
“轉(zhuǎn)義”格式是bytea
類型的傳統(tǒng)格式。它采用將二進制串表示成 ASCII 字符序列的方法,而將那些無法用 ASCII 字符表示的字節(jié)轉(zhuǎn)換成特殊的轉(zhuǎn)義語句。從應(yīng)用的角度來看,如果將字節(jié)表示為字符有意義,那么這種表示將很方便。但是在實際中,這常常是令人困擾的,因為它使二進制串和字符串之間的區(qū)別變得模糊,并且這種特別的轉(zhuǎn)義機制也有點難于處理。因此這種格式可能會在大部分新應(yīng)用中避免使用。
在轉(zhuǎn)義模式下輸入bytea
值時,某些值的字節(jié)必須被轉(zhuǎn)義,而所有的字節(jié)值都可以被轉(zhuǎn)義。通常,要轉(zhuǎn)義一個字節(jié),需要把它轉(zhuǎn)換成與它的三位八進制值, 并且前導(dǎo)一個反斜線。反斜線本身(十進制字節(jié)值 92)也可以用雙寫的反斜線表示。
bytea文字轉(zhuǎn)義字節(jié)
十進制字節(jié)值 | 描述 | 轉(zhuǎn)義輸入表示 | 例子 | 十六進制表示 |
0 | 0字節(jié) |
|
|
|
39 | 單引號 |
|
|
|
92 | 反斜線 |
|
|
|
0到31和127到255 | “不可打印的”字節(jié) |
|
|
|
轉(zhuǎn)義“不可打印的”字節(jié)的要求取決于區(qū)域設(shè)置。在某些實例中,你可以不理睬它們,讓它們保持未轉(zhuǎn)義的狀態(tài)。
單引號必須寫兩次對任何 SQL 命令中的字符串常量都是一樣的。 文字解析器消耗最外層的單引號,并縮減成對的單引號為一個普通數(shù)據(jù)字符。 bytea
輸入函數(shù)看到的只是一個單引號,它將其視為普通數(shù)據(jù)字符。 但是,bytea
輸入函數(shù)將反斜杠視為特殊字符。
在某些情況下,反斜杠必須加倍,如上所示,因為通用的字符串文字解析器也會將一對反斜杠減少為一個數(shù)據(jù)字符。
Bytea
字節(jié)默認被輸出為hex
格式。如果你把 bytea_output 改為escape
,“不可打印的”字節(jié)會被轉(zhuǎn)換成與之等效的三位八進制值并且前置一個反斜線。大部分“可打印的”字節(jié)被輸出為它們在客戶端字符集中的標準表示形式,例如:
set bytea_output = 'escape';
select 'abc \153\154\155 \052\251\124'::bytea;
bytea
----------------
abc klm *\251T
十進制值為 92(反斜線)的字節(jié)在輸出時被雙寫。
bytea輸出轉(zhuǎn)義字節(jié)
十進制字節(jié)值 | 描述 | 轉(zhuǎn)義的輸出表示 | 例子 | 輸出結(jié)果 |
92 | 反斜線 |
|
|
|
0到31和127到255 | “不可打印的”字節(jié) |
|
|
|
32到126 | “可打印的”字節(jié) | 客戶端字符集表示 |
|
|
根據(jù)你使用的前端,你在轉(zhuǎn)義和未轉(zhuǎn)義bytea
串方面可能需要做額外的工作。例如,如果你的接口自動翻譯換行和回車,你可能也不得不轉(zhuǎn)義它們。
BINARY和VARBINARY
數(shù)據(jù)BINARY類型為固定長度的二進制值,長度為N字節(jié),N的取值范圍為:1~8300字節(jié)。
數(shù)據(jù)BINARY類型需要N字節(jié)存儲。數(shù)據(jù)用尾隨零填充到最大列大小。
數(shù)據(jù)VARBINARY類型是具有最大字節(jié)長度的變長二進制值N,N的取值范圍為:1~4194304字節(jié)。
示例
create table bvar (col1 BINARY (10), col2 VARBINARY (10));
create table t (col1 BINARY(10), COL2 VARBINARY(10));
insert into t values('0x4D795','0x39274D');
select * from t;
col1 | col2
------------+----------
0x4D795 | 0x39274D
(1 row)
BLOB
BLOB數(shù)據(jù)類型存儲非結(jié)構(gòu)化二進制大對象。BLOB數(shù)據(jù)的最大大小為16 MB。
在列中定義BLOB時,不需要定義VARBINARY或者其它可變長度數(shù)據(jù)類型那樣定義最大字符數(shù)。相反,該列的定義如下:
create table blob_content (
id NUMBER PRIMARY KEY,
blob_column BLOB );
為了操作BLOB,提供了以下函數(shù):
有兩種初始化BLOB類型數(shù)據(jù)的方法,一種是使用EMPTY_BLOB函數(shù)來初始化空的BLOB類型數(shù)據(jù),另一種是直接插入數(shù)據(jù)到表中。
如需將二進制值轉(zhuǎn)換為BLOB類型,請使用TO_LOB或TO_BLOB函數(shù)。