MySQL对表达式排序的强制性:为什么两个表达式都是unicode,它';这是个错误吗?

MySQL对表达式排序的强制性:为什么两个表达式都是unicode,它';这是个错误吗?,mysql,unicode,collation,Mysql,Unicode,Collation,这是MySQL文档中关于表达式排序的部分 我知道有一些规则可以确定强制性分数,然后MySQL使用强制性分数来解决歧义 该规则规定: “如果双方具有相同的强制力,则: 如果双方都是Unicode,或双方都不是Unicode,则为错误。“ 这是什么意思?为什么这两个表达式都是unicode将是一个错误?在什么情况下会发生这种错误?免责声明:我不是这方面的专家 当比较两个字符串时,MySQL需要确保这两个字符串使用相同的排序规则/字符集(因此可以应用相同的比较规则) 当字符串使用不同的字符集/排序规则

这是MySQL文档中关于表达式排序的部分

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

该规则规定: “如果双方具有相同的强制力,则: 如果双方都是Unicode,或双方都不是Unicode,则为错误。“

这是什么意思?为什么这两个表达式都是unicode将是一个错误?在什么情况下会发生这种错误?

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

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

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

但是,当双方都是Unicode,并且可能是不同的Unicode字符集/排序规则时,例如
utf8\u general\u ci
vs
utf8\u bin
,则会出现一个错误,因为MySQL无法决定哪一方应该转换为另一方(“文档中说哪一方应该获胜”)

用外行的话说,这意味着您无法将使用排序规则a(例如
utf8\u general\u ci
)存储在列中的字符串与使用相同字符集(Unicode或其他)的排序规则B(例如
utf8\u bin
)存储在列中的字符串进行隐式比较。您将遇到如下错误:

错误1267(HY000):操作“=”的排序规则(utf8_unicode_ci,显式)和(utf8_bin,显式)的非法混合

(注意:错误消息可以包含
显式
隐式
可强制
,具体取决于查询)

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

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

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

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

但是,当双方都是Unicode,并且可能是不同的Unicode字符集/排序规则时,例如
utf8\u general\u ci
vs
utf8\u bin
,则会出现一个错误,因为MySQL无法决定哪一方应该转换为另一方(“文档中说哪一方应该获胜”)

用外行的话说,这意味着您无法将使用排序规则a(例如
utf8\u general\u ci
)存储在列中的字符串与使用相同字符集(Unicode或其他)的排序规则B(例如
utf8\u bin
)存储在列中的字符串进行隐式比较。您将遇到如下错误:

错误1267(HY000):操作“=”的排序规则(utf8_unicode_ci,显式)和(utf8_bin,显式)的非法混合

(注意:错误消息可以包含
显式
隐式
可强制
,具体取决于查询)


故事的寓意是:避免在同一架构中混合不同的排序规则。

请提供一个示例。@RickJames这是一个关于MySQL官方文档的问题,文档中没有给出示例。请提供一个示例。@RickJames这是一个关于MySQL官方文档的问题,文档中没有给出示例。警告:“unicode”有点模糊。它可能指的是
字符集ucs2
。您在给出的示例中所假定的是不正确的,因为规则明确规定:“如果双方具有相同的强制力…”。事实上,这就是我感到困惑的原因。@Devy这个例子怎么不正确?我举了一个例子,其中双方都具有相同的强制性(这是“显式的”,即在本例中为0),并且双方都是Unicode。。。这不是你的问题吗?@rlanvin也许我不太理解强制与排序的关系。他们不是一回事吗?@Devy不,他们不是。字符集确定字符串的编码(存储)方式。排序规则确定如何比较字符串(特别是在排序时,例如,是
ä
之前、之后还是等于
a
?)。强制性决定了字符串转换为另一个字符集/排序规则的能力。注意:“unicode”有点模糊。它可能指的是
字符集ucs2
。您在给出的示例中所假定的是不正确的,因为规则明确规定:“如果双方具有相同的强制力…”。事实上,这就是我感到困惑的原因。@Devy这个例子怎么不正确?我举了一个例子,其中双方都具有相同的强制性(这是“显式的”,即在本例中为0),并且双方都是Unicode。。。这不是你的问题吗?@rlanvin也许我不太理解强制与排序的关系。他们不是一回事吗?@Devy不,他们不是。字符集确定字符串的编码(存储)方式。排序规则确定如何比较字符串(特别是在排序时,例如,是
ä
之前、之后还是等于
a
?)。强制性确定字符串转换为另一个字符集/排序规则的能力。