的二进制
而且VARBINARY
类型类似于字符
而且VARCHAR
,只不过它们存储的是二进制字符串而不是非二进制字符串。也就是说,它们存储的是字节串而不是字符串。这意味着他们有二进制
字符集和排序、比较和排序都基于值中字节的数值。
允许的最大长度与二进制
而且VARBINARY
因为它是为了字符
而且VARCHAR
,除了长度为二进制
而且VARBINARY
以字节而不是字符来度量。
的二进制
而且VARBINARY
数据类型不同于字符的二进制
而且VARCHAR二进制
数据类型。对于后一种类型,二进制
属性不会导致将列视为二进制字符串列。相反,它会导致二进制(_bin
)要使用的列字符集的排序规则(如果没有指定列字符集,则为表默认字符集),并且列本身存储非二进制字符串而不是二进制字节字符串。例如,如果默认字符集为latin1
,CHAR(5)二进制
被视为CHAR(5)字符集latin1 COLLATE latin1_bin
.这不同于二(5)
属性的5字节二进制字符串二进制
字符集和排序。的差异的信息二进制
整理二进制
字符集和_bin
非二进制字符集的排序,请参见第10.8.5节“binary Collation compare to _bin Collations”.
如果没有启用严格的SQL模式,并且将值赋给二进制
或VARBINARY
如果列的长度超过该列的最大长度,则该值将被截断以适合该列,并生成警告。对于截断的情况,要导致错误发生(而不是警告)并抑制值的插入,请使用严格的SQL模式。看到第5.1.10节,“Server SQL模式”.
当二进制
值被存储,它们被填充为指定长度的填充值。pad值为0 x00
(零字节)。值右填充0 x00
对于插入,并且检索时不删除尾随字节。所有字节在比较中都是重要的,包括命令
而且截然不同的
操作。0 x00
与空间不同的比较,与0 x00
在空格之前排序。
示例:二(3)
列,“一个”
就变成了' \ 0
当插入。' \ 0
就变成了“\ \ 0”
当插入。两个插入的值在检索时保持不变。
为VARBINARY
,对插入没有填充,也没有为检索剥离字节。所有字节在比较中都是重要的,包括命令
而且截然不同的
操作。0 x00
与空间不同的比较,与0 x00
在空格之前排序。
对于去掉尾随pad字节或比较忽略它们的情况,如果列的索引需要唯一值,则在列中插入仅在尾随pad字节数量上不同的值将导致重复键错误。例如,如果一个表包含“一个”
,试图储存' \ 0
导致重复密钥错误。
如果计划使用。则应仔细考虑上述填充和剥离特性二进制
用于存储二进制数据的数据类型,您要求检索的值与存储的值完全相同。下面的例子说明了如何操作0 x00
填充的二进制
值影响列值比较:
CREATE TABLE t (c BINARY(3));查询OK, 0行影响(0.01秒)mysql> INSERT INTO t SET c = 'a';查询OK, 1 row affected (0.01 sec) mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t;+--------+---------+-------------+ | 十六进制(c) | c = c a | = ' \ 0 \ 0 ' | +--------+---------+-------------+ | 610000 | 0 | 1 | +--------+---------+-------------+ 1行集(0.09秒)
如果检索到的值必须与为不带填充的存储指定的值相同,则最好使用VARBINARY
或者其中一个团
而是数据类型。