在大多数语句中,MySQL使用什么排序来解析比较操作是显而易见的。例如,在下面的情况中,应该很清楚排序规则是列的排序规则X
:
从x从t outder选择x;从x = 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字符集WINS,并且将自动字符集转换应用于非Unicode侧。例如,以下语句不会返回错误:
SELECT CONCAT(utf8_column, latin1_column) FROM t1;
它返回一个具有字符集的结果
use utf8
同样的排序UTF8_Column.
。价值latin1_column
自动转换为use utf8
在连接之前。对于来自同一字符集的操作数的操作,但混合了
_BIN.
排序和_CI.
或_CS
排序,_BIN.
使用排序。这类似于将非二进制字符串和二进制字符串混合的操作将操作数计算为二进制字符串,应用于排序而不是数据类型。
尽管SQL标准中没有自动转换,但该标准确实指出(就支持的字符而言)每个字符集都是a“子集“Unicode。因为这是一个众所周知的原则“适用于超集的东西可以应用于子集,“我们认为Unicode的排序规则可以应用于与非Unicode字符串的比较。更一般地,MySQL使用字符集保留表的概念,它有时可用于确定字符集之间的子集关系,并允许在操作中转换操作数,否则将产生错误。看第10.2.1节“字符集曲目”。
下表说明了上述规则的一些应用。
比较 | 使用的整理 |
---|---|
column1 = ' ' |
使用排序第1列 |
COLLATE x . COLLATE x . COLLATE x . COLLATE |
使用排序'a'collate x |
column1 collate x ='a'collate y |
错误 |
要确定字符串表达式的强制性,请使用胁迫()
功能(参见第12.16节“信息功能”):
mysql> SELECT mandatory (_utf8'A' COLLATE utf8_bin);-> 0 mysql> SELECT mandatory (VERSION());-> 3 mysql> SELECT mandatory ('A');-> 4 mysql> SELECT mandatory (1000);-> 5 mysql> SELECT mandatory (NULL);- > 6
用于将数值或时间值隐式转换为字符串,例如用于参数1
在表达式中concat(1,'abc')
,结果是一个字符(非inary)字符串,其具有字符集和排序规则character_set_connection.
和Collation_Connection.
系统变量。看第12.3节“表达式评估中的类型转换”。