BINARY和VARBINARY類型--MySql數據庫
2024-07-24 12:40:07
供稿:網友
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(零字節)。插入值時在右側添加0x00on,并且選擇時不刪除尾部的字節。比較時所有字節很重要,包括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列的類型。參見13.1.5.1節,“沉寂的列規格變更”。