我创建了以下测试表:
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
答案 0 :(得分:5)
以下是我能够找到阅读documentation:
的区别VARCHAR BINARY
<强> VARBINARY 强>
答案 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
仅将值作为原始字节字符串。LOWER
/ UPPER
函数)对VARBINARY
无效(字节无大小写)。VARCHAR BINARY
比较中通常会忽略尾随空格(即'x ' = 'x'
为真)。