10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

10.8.4表达式中的排序强制力

在绝大多数语句中,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分配强制值如下:

  • 一个显式的核对子句的强制力为0(完全不可强制)。

  • 具有不同排序规则的两个字符串的拼接具有1的矫顽力。

  • 列、存储的例程参数或局部变量的排序具有2的强制力。

  • 一个系统常数函数返回的字符串用户()(版本))的矫顽力为3。

  • 文字的排序具有4的强制力。

  • 数值或时间值的排序具有5的矫顽力。

  • 或者一个从它的矫顽力是6。

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节“表达式求值中的类型转换”