1. 程式人生 > >BINARY和VARBINARY型別的區別

BINARY和VARBINARY型別的區別

BINARY和VARBINARY類類似於CHAR和VARCHAR,不同的是它們包含二進位制字串而不要非二進位制字串。也就是說,它們包含位元組字串而不是字元字串。這說明它們沒有字符集,並且排序和比較基於列值位元組的數值值。

BINARY和VARBINARY允許的最大長度一樣,如同CHAR和VARCHAR,不同的是BINARY和VARBINARY的長度是位元組長度而不是字元長度。

BINARY 和VARBINARY資料型別不同於CHAR BINARY和VARCHAR BINARY資料型別。對於後一種型別,BINARY屬性不會將列視為二進位制字串列。相反,它致使使用列字符集的二元校對規則,並且列自身包含非二進位制 字元字串而不是二進位制位元組字串。例如CHAR(5) BINARY被視為CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin,假定預設字符集是latin1。這不同於BINARY(5),它儲存5位元組二進位制字串,沒有字符集或校對規則。


當儲存BINARY值時,在它們右邊填充值以達到指定長度。填充值是0x00(零位元組)。 插入值時在右側新增0x00 on,並且選擇時不刪除尾部的位元組。比較時所有位元組很重要,包括ORDER BY和DISTINCT操作。比較時0x00位元組和空格是不同的,0x00<空格。

例如:對於一個BINARY(3)列,當插入時 'a' 變為 'a \0'。'a\0'插入時變為'a\0\0'。當選擇時兩個插入的值均不更改。

對於VARBINARY,插入時不填充字元,選擇時不裁剪位元組。比較時所有位元組很重要,包括ORDER BY和DISTINCT操作。比較時0x00位元組和空格是不同的,0x00<空格。

對於尾部填充字元被裁剪掉或比較時將它們忽視掉的情形,如果列的索引需要唯一的值,在列內插入一個只是填充字元數不同的值將會造成複製鍵值錯誤。


如果你計劃使用這些資料型別來儲存二進位制資料並且需要檢索的值與儲存的值完全相同,應考慮前面所述的填充和裁剪特徵。下面的例子說明了用0x00填充的BINARY值如何影響列值比較:

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)
如果檢索的值必須與指定進行儲存而沒有填充的值相同,最好使用BLOB資料型別。

建立表時,MySQL 可以默默更改BINARY或VARBINARY列的型別