文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  BINARY 和 VARBINARY 類型

13.3.3 BINARY 和 VARBINARY 類型

BINARYVARBINARY 類型類似於 CHARVARCHAR,但它們儲存的是二進位字串而不是非二進位字串。也就是說,它們儲存的是位元組字串而不是字元字串。這表示它們具有 binary 字元集和校對,並且比較和排序是基於值中位元組的數值。

BINARYVARBINARY 的允許最大長度與 CHARVARCHAR 相同,只是 BINARYVARBINARY 的長度是以位元組而不是字元來測量。

BINARYVARBINARY 資料類型與 CHAR BINARYVARCHAR 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 模式,且您為 BINARYVARBINARY 欄位指派的值超過欄位的最大長度,則該值會被截斷以符合,並產生警告。對於截斷的情況,若要讓錯誤發生 (而不是警告) 並抑制值的插入,請使用嚴格的 SQL 模式。請參閱 第 7.1.11 節,「伺服器 SQL 模式」

儲存 BINARY 值時,它們會使用填補值向右填補至指定的長度。填補值為 0x00 (零位元組)。值會使用 0x00 向右填補以進行插入,而且擷取時不會移除尾隨位元組。所有位元組在比較中都很重要,包括 ORDER BYDISTINCT 作業。0x00 和空格在比較中不同,0x00 會在空格之前排序。

範例:對於 BINARY(3) 欄,插入時 'a ' 會變成 'a \0'。插入時 'a\0' 會變成 'a\0\0'。兩個插入的值在擷取時都會保持不變。

對於 VARBINARY,插入時沒有填補,擷取時也不會剝除位元組。所有位元組在比較中都很重要,包括 ORDER BYDISTINCT 作業。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 命令列用戶端」