11.3.3 BINARY 和 VARBINARY 类型
官方文檔地址:11.3.3 The BINARY and VARBINARY Types
BINARY和VARBINARY類型與CHAR和VARCHAR類似,不同之處是它們存儲的是二進(jìn)制字符串而不是非二進(jìn)制字符串。也就是說,它們存儲的是字節(jié)字符串而不是字符字符串。這意味著它們具有二進(jìn)制字符集和排序規(guī)則,比較和排序基于值中字節(jié)的數(shù)值。
BINARY和VARBINARY允許的最大長度與CHAR和VARCHAR相同,不同的是BINARY和VARBINARY的長度是以字節(jié)而不是字符來度量的。
BINARY和VARBINARY數(shù)據(jù)類型不同于CHAR BINARY和VARCHAR BINARY數(shù)據(jù)類型。對于后一種類型,BINARY屬性不會使列被視為二進(jìn)制字符串列。相反,它會導(dǎo)致該列使用字符集的二進(jìn)制(_bin)排序規(guī)則(如果沒有指定列字符集,則使用表默認(rèn)字符集),并且列本身存儲非二進(jìn)制字符字符串而不是二進(jìn)制字節(jié)字符串。例如,如果默認(rèn)字符集為utf8mb4,則CHAR(5) BINARY將被視為CHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin。這與BINARY(5)不同,BINARY(5)存儲具有二進(jìn)制字符集和排序規(guī)則的5字節(jié)二進(jìn)制字符串。有關(guān)二進(jìn)制字符集的二進(jìn)制排序規(guī)則和非二進(jìn)制字符集的_bin排序規(guī)則之間的區(qū)別的信息,請參閱 10.8.5 二進(jìn)制排序規(guī)則與 _bin 排序規(guī)則的比較。
如果沒有啟用嚴(yán)格 SQL 模式,并且將超過列最大長度的值分配給BINARY或VARBINARY列,該值會被截斷以適合列的最大長度,并生成警告。要禁止非空格字符的截斷,可以使用嚴(yán)格的 SQL 模式導(dǎo)致出現(xiàn)錯誤(而不是警告)并禁止插入值。參見 5.1.11 服務(wù)器 SQL 模式。
當(dāng)存儲BINARY值時,它們將被右填充為指定長度的填充值。pad 值是0x00(零字節(jié))。值在插入時用0x00右填充,檢索時不刪除尾隨字節(jié)。所有的字節(jié)在比較中都是重要的,包括ORDER BY和DISTINCT操作。0x00和空格在比較時是不同的,0x00在空格之前排序。
例如:對于一個BINARY(3)列,'a '在插入時變成'a \0'。'a\0'在插入時變成'a\0\0'。兩個插入的值在檢索時都保持不變。
對于VARBINARY,插入時沒有填充,檢索時也沒有字節(jié)剝離。所有的字節(jié)在比較中都是重要的,包括ORDER BY和DISTINCT操作。0x00和空格在比較時是不同的,0x00在空格之前排序。
對于那些刪除了尾隨字節(jié)或在比較時忽略它們的情況,如果列具有唯一值的索引,則向列中插入僅在尾隨字節(jié)數(shù)量上不同的值將導(dǎo)致重復(fù)鍵錯誤。例如,如果一個表包含'a',嘗試存儲'a\0'會導(dǎo)致重復(fù)鍵錯誤。
如果計(jì)劃使用BINARY數(shù)據(jù)類型存儲二進(jìn)制數(shù)據(jù),并且要求檢索到的值與存儲的值完全相同,則應(yīng)該仔細(xì)考慮前面的填充和剝離特征。下面的例子說明了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數(shù)據(jù)類型。
總結(jié)
以上是生活随笔為你收集整理的11.3.3 BINARY 和 VARBINARY 类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu远程操作Linux服务器GU
- 下一篇: 转载——开阔自己的视野,勇敢的接触新知识