MySQL对表达式整理的强制性:为什么两个表达式都是unicode,这是一个错误?

时间:2015-08-20 21:42:37

标签: mysql unicode collation

这是关于Collat​​ion of Expression的MySQL文档。 https://dev.mysql.com/doc/refman/5.5/en/charset-collation-expressions.html

我知道有确定强制性分数的规则,然后MySQL使用强制性分数来解决歧义。

规则规定: "如果双方具有相同的强制性,那么:    如果双方都是Unicode,或双方都不是Unicode,那就是错误。"

这是什么意思?为什么两个表达式都是unicode会出错?在什么条件下会发生错误?

1 个答案:

答案 0 :(得分:0)

免责声明:我不是这方面的专家。

比较两个字符串时,MySQL需要确保两个字符串使用相同的排序/字符集(因此可以应用相同的比较规则)。

当字符串使用不同的字符集/归类时,MySQL有规则来确定哪一个应该转换为另一个。一般规则是将非Unicode字符集转换为Unicode字符集。

但是,如果双方都是Unicode,并且可能是不同的Unicode字符集/排序规则,例如utf8_general_ci vs utf8_bin,那么您会收到错误,因为MySQL不能决定将哪一个转换成另一个("哪一方应该获胜"正如他们在文档中所说的那样)

在外行人的术语中,这意味着您不能使用排序规则A(例如utf8_general_ci)与使用排序规则B存储在列中的字符串(例如{{1})隐含地比较存储在列中的字符串})相同的字符集(Unicode或其他)。你会出现这样的错误:

  

ERROR 1267(HY000):操作的非法混合(utf8_unicode_ci,EXPLICIT)和(utf8_bin,EXPLICIT)' ='

(注意:错误消息可以包含utf8_binEXPLICITIMPLICIT,具体取决于查询)

故事的寓意:避免在同一模式中混合使用不同的排序规则。