BINARY
和 VARBINARY
類型與 CHAR
和 VARCHAR
類似,不同之處在於它們儲存二進位字串而不是非二進位字串。也就是說,它們儲存的是位元組字串而不是字元字串。這表示它們具有 binary
字元集和定序,而且比較和排序是根據值中位元組的數值進行的。
BINARY
和 VARBINARY
的允許最大長度與 CHAR
和 VARCHAR
相同,不同之處在於 BINARY
和 VARBINARY
的長度是以位元組而不是字元來測量的。
BINARY
和 VARBINARY
資料類型與 CHAR BINARY
和 VARCHAR BINARY
資料類型不同。對於後者類型,BINARY
屬性不會導致將欄位視為二進位字串欄位。相反地,它會導致為欄位字元集(如果未指定欄位字元集,則為表格預設字元集)使用二進位 (_bin
) 定序,而且欄位本身儲存非二進位字元字串,而不是二進位位元組字串。例如,如果預設字元集為 utf8mb4
,則 CHAR(5) BINARY
會被視為 CHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
。這與 BINARY(5)
不同,後者會儲存具有 binary
字元集和定序的 5 位元組二進位字串。如需關於 binary
字元集的 binary
定序與非二進位字元集的 _bin
定序之間差異的資訊,請參閱第 12.8.5 節,「binary 定序與 _bin 定序的比較」。
如果未啟用嚴格 SQL 模式,而且您將值指派給超出欄位最大長度的 BINARY
或 VARBINARY
欄位,則該值會被截斷以符合大小,並產生警告。對於截斷的情況,若要讓發生錯誤(而不是警告)並抑制值的插入,請使用嚴格 SQL 模式。請參閱第 7.1.11 節,「伺服器 SQL 模式」。
當儲存 BINARY
值時,它們會使用填補值向右填補到指定的長度。填補值為 0x00
(零位元組)。插入時會以 0x00
向右填補值,而且擷取時不會移除尾隨位元組。所有位元組在比較中都很重要,包括 ORDER BY
和 DISTINCT
運算。0x00
和空格在比較中不同,0x00
會在空格之前排序。
範例:對於 BINARY(3)
欄位,插入時 'a '
會變成 'a \0'
。插入時 'a\0'
會變成 'a\0\0'
。對於擷取,兩個插入值都保持不變。
對於 VARBINARY
,插入時沒有填補,而且擷取時不會移除位元組。所有位元組在比較中都很重要,包括 ORDER BY
和 DISTINCT
運算。0x00
和空格在比較中不同,0x00
會在空格之前排序。
在會移除尾隨填補位元組或比較會忽略尾隨填補位元組的那些情況下,如果欄位具有需要唯一值的索引,則將僅尾隨填補位元組數量不同的值插入欄位會導致重複金鑰錯誤。例如,如果表格包含 'a'
,則嘗試儲存 'a\0'
會導致重複金鑰錯誤。
如果您打算使用 BINARY
資料類型來儲存二進位資料,而且您要求擷取的值與儲存的值完全相同,則您應仔細考慮先前的填補和移除特性。以下範例說明 BINARY
值的 0x00
填補如何影響欄位值的比較
mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec)
mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+
| HEX(c) | c = 'a' | c = 'a\0\0' |
+--------+---------+-------------+
| 610000 | 0 | 1 |
+--------+---------+-------------+
1 row in set (0.09 sec)
如果擷取的值必須與指定用於儲存的值相同,且沒有填補,則最好改為使用 VARBINARY
或其中一個 BLOB
資料類型。
在 mysql 用戶端內,二進位字串會使用十六進位表示法顯示,具體取決於 --binary-as-hex
的值。如需關於該選項的詳細資訊,請參閱第 6.5.1 節,「mysql — MySQL 命令列用戶端」。