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 節,「二進位校對與 _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 命令列用戶端」。