如果我们在不同的varchar列中使用不同的排序规则来存储字符串,并在一个SQL查询中使用多个这样的列,则该SQL查询可能会抛出错误“无效的混合排序规则”。(例如,如果我们想要比较两个不兼容的排序规则的字符串或尝试将不同排序规则的数据选择到一个组合列中)。
但是,如果我们在查询中指定“COLLATE”,那么这个问题可以得到解决。例如:
WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_ci
然而,这将使您失去任何索引。
为了防止“无效混合排序”错误,我们可以使用varbinary。
如果varchar列使用了多字节排序,则varbinary使用的空间较少。 (二进制字符串没有字符集和排序规则。 二进制字符串仅是一系列字节值)。
***顺便说一下,字符集是符号和编码的集合。 排序是对字符集中的字符进行比较的一组规则https://dev.mysql.com/doc/refman/5.7/en/charset-general.html
但是,如果您选择单字节字符集(例如latin1)而不是多字节字符集(例如utf8或ucs2),则varbinary和varchar的空间要求相同。
如果没有有效性检查,则VARBINARY优于VARCHAR。例如,如果默认字符集为UTF8,则此操作是非法的:
CREATE TABLE t9 (s1 VARCHAR(5));
INSERT INTO t9 VALUES (0xF4808283);
但是,这是合法的,因为字符集并不重要:
CREATE TABLE t10 (s1 VARBINARY(5));
INSERT INTO t10 VALUES (0xF4808283);
所以,VARCHAR使用“排序规则”比较字符,而VARBINARY使用字节进行比较。大多数排序规则都是“不区分大小写”的,因此大写字母和小写字母被视为相等。由于VARBINARY不使用任何排序规则,所以在VARBINARY的情况下,搜索操作始终区分大小写。