在绝大多数语句中,MySQL使用什么排序规则来解决比较操作是显而易见的。例如,在以下情况下,应该明确排序规则是列的排序规则x
:
SELECT x FROM T ORDER BY xSELECT x FROM T WHERE x = x从T中选择不同的x
但是,对于多个操作数,可能会有歧义。例如,该语句执行列之间的比较x
字符串字面量“Y”
:
SELECT x FROM T WHERE x = 'Y'
如果x
而且“Y”
具有相同的排序规则,用于比较的排序规则没有歧义。但如果他们有不同的整理,比较应该使用的整理x
,或“Y”
?这两个x
而且“Y”
有排序规则,那么哪个排序规则优先?
除了比较之外,还可能在上下文中混合出现排序。例如,一个多参数连接操作,例如CONCAT (x, Y)
组合其参数以生成单个字符串。结果应该有什么排序?
为了解决这类问题,MySQL检查一个项的排序是否可以被强制转换为另一个项的排序。MySQL分配强制值如下:
MySQL使用强制值和以下规则来解决歧义:
使用矫顽力值最低的排序。
如果双方具有相同的强制力,则:
如果两边都是Unicode,或者两边都不是Unicode,这是一个错误。
如果一方拥有Unicode字符集,而另一方拥有非Unicode字符集,则拥有Unicode字符集的一方获胜,自动字符集转换将应用于非Unicode一方。例如,以下语句不返回错误:
SELECT (utf8mb4_column, latin1_column) FROM t1;
它返回一个字符集为的结果
utf8mb4
同样的排序utf8mb4_column
.的值latin1_column
自动转换为utf8mb4
在连接之前。对于具有来自相同字符集的操作数但混合了
_bin
排序和_ci
或_cs
排序,_bin
使用排序。这类似于混合非二进制和二进制字符串的操作如何将操作数计算为二进制字符串,应用于排序规则而不是数据类型。
尽管SQL标准中没有自动转换,但该标准确实说每个字符集(就支持的字符而言)都是a”子集”Unicode。因为这是一个众所周知的原则”适用于超集的东西也适用于子集,”我们相信Unicode的排序规则可以应用于与非Unicode字符串的比较。更一般地,MySQL使用字符集表的概念,它有时可用于确定字符集之间的子集关系,并在操作中启用操作数的转换,否则将产生错误。看到第10.2.1节“字符集集”.
下表说明了上述规则的一些应用。
比较 | 使用排序 |
---|---|
column1 = ' ' |
使用排序column1 |
column1 = 'A' COLLATE x |
使用排序“A”核对x |
columnn1 COLLATE x = 'A' COLLATE y |
错误 |
要确定字符串表达式的强制能力,请使用可压缩性()
函数(见第12.16条“资讯功能”):
mysql> SELECT (_utf8'A' COLLATE utf8_bin);mysql: SELECT (VERSION());3 mysql> SELECT mandatory ('A');4 mysql> SELECT mandatory (1000);查询mysql中>和>的值- > 6
用于将数值或时间值隐式转换为字符串,例如实参1
在表达CONCAT (abc)
方法确定的字符集和排序规则,结果是一个字符(非二进制)字符串character_set_connection
而且collation_connection
系统变量。看到第12.3节“表达式求值中的类型转换”.