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