这是关于Collation of Expression的MySQL文档。 https://dev.mysql.com/doc/refman/5.5/en/charset-collation-expressions.html
我知道有确定强制性分数的规则,然后MySQL使用强制性分数来解决歧义。
规则规定: "如果双方具有相同的强制性,那么: 如果双方都是Unicode,或双方都不是Unicode,那就是错误。"
这是什么意思?为什么两个表达式都是unicode会出错?在什么条件下会发生错误?
答案 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_bin
或EXPLICIT
或IMPLICIT
,具体取决于查询)
故事的寓意:避免在同一模式中混合使用不同的排序规则。