MySQL中“VARCHAR BINARY”和“VARBINARY”之间有什么区别?

时间:2015-03-27 02:33:22

标签: mysql collation binary-data

我创建了以下测试表:

CREATE TABLE t (
   a VARCHAR(32) BINARY,
   b VARBINARY(32)
);

INSERT INTO t (a, b) VALUES ( 'test    ', 'test    ');
INSERT INTO t (a, b) VALUES ( 'test    \0', 'test    \0');

但是这个查询表明这两种类型没有区别:

SELECT a, LENGTH(a), HEX(a), b, LENGTH(b), HEX(b) FROM t;

a          LENGTH(a)  HEX(a)              b          LENGTH(b)  HEX(b)              
---------  ---------  ------------------  ---------  ---------  --------------------
test               8  7465737420202020    test               8  7465737420202020    
test               9  746573742020202000  test               9  746573742020202000  

2 个答案:

答案 0 :(得分:5)

以下是我能够找到阅读documentation

的区别

VARCHAR BINARY

  • BINARY属性导致使用列字符集的二进制排序规则,列本身包含非二进制字符串而不是二进制字节字符串。
  • 存储BINARY值时,将它们右键填充,填充值为指定长度。
  • 如果计划使用BINARY数据类型存储二进制数据,并且要求检索的值与存储的值完全相同,则应仔细考虑前面的填充和剥离特性。

<强> VARBINARY

  • 如果未启用严格的SQL模式,并且您尝试分配的值超出列的最大长度,则会截断该值以适应并生成警告。
  • 插入时没有填充,选择时不会删除任何字节。所有字节在比较中都很重要。
  • 当检索到的值必须与没有填充的存储指定的值相同时,最好使用。

答案 1 :(得分:4)

正如String Data Type Syntax上的MySQL手册页所述,VARBINARY等效于VARCHAR CHARACTER SET binary,而VARCHAR BINARY等效于VARCHAR CHARACTER SET latin1 COLLATE latin1_bin(或其他一些非具有相应二进制排序规则的二进制字符集;它取决于表设置):

为字符串数据类型指定CHARACTER SET二进制属性会导致将列创建为相应的二进制字符串数据类型:CHAR变为BINARY,VARCHAR变为VARBINARY,TEXT成为BLOB。

BINARY属性是一种非标准的MySQL扩展,它是用于指定列字符集(或未指定列字符集的表默认字符集)的二进制(_bin)排序规则的简写。

因此,VARBINARY存储字节; VARCHAR BINARY存储字符代码,但将它们像字节一样排序(几乎-见下文)。

The binary Collation Compared to _bin Collations手册页对此做了解释:

  • VARBINARY通过逐字节比较进行排序; VARCHAR BINARY比较对应于字符的字节组(对于大多数编码而言,差别不大)
  • VARCHAR BINARY在从另一列分配具有不同编码的值时,或者当客户端使用不同编码插入/更新该值时,将执行字符集转换; VARBINARY仅将值作为原始字节字符串。
  • SQL中的大小写转换(即LOWER / UPPER函数)对VARBINARY无效(字节无大小写)。
  • VARCHAR BINARY比较中通常会忽略尾随空格(即'x ' = 'x'为真)。