【问题标题】:MySQL Coercibility on collation of expressions: why both expressions are unicode, it's an error?MySQL对表达式排序的强制:为什么两个表达式都是unicode,这是一个错误?
【发布时间】:2015-11-14 17:23:28
【问题描述】:

这是来自关于表达式排序规则的 MySQL 文档。 https://dev.mysql.com/doc/refman/5.5/en/charset-collation-expressions.html

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

规则规定: “如果双方具有相同的强制力,那么: 如果两边都是 Unicode,或者两边都不是 Unicode,那就是错误。”

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

【问题讨论】:

  • 请举个例子。
  • @RickJames 这是关于 MySQL 官方文档的问题,文档中没有给出示例。

标签: mysql unicode collation


【解决方案1】:

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

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

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

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

用外行的话来说,这意味着您不能隐式地将使用排序规则 A(例如 utf8_general_ci)存储在列中的字符串与使用排序规则 B(例如 utf8_bin)存储在列中的字符串进行相同的字符集( Unicode 或其他)。你会出现这样的错误:

错误 1267 (HY000):非法混合排序规则 (utf8_unicode_ci,EXPLICIT) 和 (utf8_bin,EXPLICIT) 用于操作 '='

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

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

【讨论】:

  • 警告:“unicode”有点模糊。可以参考CHARACTER SET ucs2
  • 您在给出的示例中假设的内容是不正确的,因为规则明确指出:“如果双方具有相同的强制力......”。事实上,这就是我感到困惑的原因。
  • @Devy 这个例子有什么不正确的地方吗?我举了一个例子,双方具有相同的强制力(即“EXPLICIT”,在这种情况下为0),并且双方都是Unicode......这不是你的问题吗?
  • @rlanvin 也许我不太了解强制力与排序规则。而且它们不是一回事?
  • @Devy 不,他们不是。 字符集 确定字符串的编码(存储)方式。 Collat​​ion 确定字符串将如何比较(尤其是在排序时,例如ä 是在a 之前、之后还是等于a?)。 Coercibility 决定了一个字符串被转换成另一个字符集/排序规则的能力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 2012-01-26
  • 2018-10-10
  • 2021-12-28
相关资源
最近更新 更多