utf8_bin 和 utf8_general_cs 是一样的吗?

Din*_*mar 3 mysql collation utf-8

这是情况:

  1. 我遇到了几个关于“ utf8_bin vs utf8_general_ci ”的帖子。
  2. 同样,“ utf8_general_cs vs utf8_general_ci ”。

但是我找不到“ utf8_bin vs utf8_general_cs ”的帖子。那么,它们是一样的吗?如果不是,它们之间有什么区别?

注意:我已经检查过utf8_general_cs在默认 MySQL 中不可用。我可以知道为什么吗?

Sol*_*zky 5

不幸的是,二进制排序规则与区分大小写的排序规则相同的概念非常普遍。

但是,它们在功能上非常不等效。有四个方面可以看出行为差异(我知道至少有四个):

  1. 组合字符

    考虑有一个小写ü(“u”带分音符)和一个大写Ü(“U”带分音符)。两种类型的排序规则都能够区分它们。

    现在,考虑有一个大写字母U 一个?(组合分音符)。当组合字符放在非重音 之后时U,您会得到U?. 视觉上它与单曲相同Ü(“U”带分音符)。并且区分大小写(甚至区分重音)的归类将它们看起来相同,即使一个是单个代码点而另一个是两个代码点的组合。但是二进制排序规则不能将它们比较为相等,因为它们不是相同的代码点(甚至不是相同数量的代码点)。

  2. 全角字符

    区分大小写但不区分宽度的排序规则将能够等同于=?==o=。但是,二进制排序规则不能将它们视为相等,因为它们是不同的代码点。

  3. 口音不敏感

    区分大小写但不区分重音的排序规则将能够等同于oô。但是,二进制排序规则不能将它们视为相等,因为它们是不同的代码点。

  4. 排序

    区分大小写的排序规则将整理~之前aA之后。但是,二进制排序将那些相同的字符进行排序:A然后a然后~

所有这些都记录在我的以下帖子中:

不,二进制排序规则不区分大小写

它以 Microsoft SQL Server 的形式呈现,但行为基于 Unicode 标准定义的规则,这些规则在 RDBMS、语言、操作系统等之间应该是相同的(由于正在使用哪个版本的 Unicode 标准而略有不同) Unicode 只是一个标准,并且在不同供应商之间的实施略有不同)。


我已经检查过 utf8_general_cs 在默认 MySQL 中不可用。我可以知道为什么吗?

我的猜测是“通用”排序规则已经过时,已被更新的“unicode”和特定于文化的排序规则所取代。该文件(中途下来的页面,段落开头“对于任何Unicode字符集, ”)甚至指出:

utf8_general_ci是不支持扩展、收缩或可忽略字符的旧排序规则。它只能在字符之间进行一对一的比较。

“unicode”排序规则可能是默认的排序权重和排序规则。特定于文化的排序规则定制权重和规则以适合该文化(当默认值不正确时)。有关为什么会有不同排序规则的更多信息,请参阅我对以下 SO 问题的回答:

nvarchar (Unicode) 列的 COLLATIONS 有什么意义?