Dinesh Kumar Asked: 2018-09-13 22:56:23 +0800 CST2018-09-13 22:56:23 +0800 CST 2018-09-13 22:56:23 +0800 CST utf8_bin 和 utf8_general_cs 一样吗? 772 情况如下: 我遇到了几篇关于“ utf8_bin vs utf8_general_ci ”的帖子。 同样,“ utf8_general_cs vs utf8_general_ci ”。 但我找不到“ utf8_bin vs utf8_general_cs ”的帖子。那么,它们是一样的吗?如果不是,它们之间有什么区别? 注意:我检查了默认 MySQL 中没有utf8_general_cs 。我可以知道为什么吗? mysql collation 1 个回答 Voted Best Answer Solomon Rutzky 2018-09-14T05:28:56+08:002018-09-14T05:28:56+08:00 不幸的是,二进制排序规则与区分大小写排序规则相同的概念非常普遍。 但是,它们在功能上非常不等效。有四个方面可以看出行为差异(我知道至少有四个): 组合字符 考虑使用小写字母ü(“u”与分音符号)和大写字母Ü(“U”与分音符号)。这两种归类都将能够区分它们。 现在,考虑有一个大写字母U 和一个̈(组合分音符号)。当组合字符放在非重音之后U,你得到Ü. 从视觉上看,它与单曲Ü(带有分音符号的“U”)相同。并且区分大小写(甚至区分重音)的排序规则看起来它们是相同的,即使一个是单个代码点而另一个是两个代码点的组合。但是二进制排序规则无法将它们比较为相等,因为它们不是相同的代码点(甚至是相同数量的代码点)。 全角字符 区分大小写但不区分宽度的排序规则将能够等同于=o=和=o=。但是,由于它们是不同的代码点,因此二进制排序规则看起来并不相同。 口音不敏感 区分大小写但不区分重音的排序规则将能够等同于oand ô。但是,由于它们是不同的代码点,因此二进制排序规则看起来并不相同。 排序 区分大小写的排序规则将在其~前后排序。但是,二进制排序规则会将这些相同的字符排序为:then 。aAAa~ 所有这些都记录在我的以下帖子中: 不,二进制排序规则不区分大小写 它以 Microsoft SQL Server 的形式呈现,但其行为基于 Unicode 标准定义的规则,这些规则在 RDBMS、语言、操作系统等之间应该是相同的(由于正在使用的 Unicode 标准版本不同,略有差异)使用,以及谁来实现,因为 Unicode 只是一个标准,并且在不同供应商之间实现了细微的差异)。 我检查了 utf8_general_cs 在默认 MySQL 中不可用。我可以知道为什么吗? 我的猜测是“通用”排序规则已经过时,并已被更新的“unicode”和特定于文化的排序规则所取代。文档(在页面的中间,以“ For any Unicode character set, ”开头的段落)甚至指出: utf8_general_ci是不支持扩展、收缩或可忽略字符的遗留排序规则。它只能在字符之间进行一对一的比较。 “unicode”排序规则可能是默认的排序权重和排序规则。特定于文化的排序规则为该文化定制权重和规则以使其正确(当默认值不正确时)。有关为什么有不同排序规则的更多信息,请参阅我对以下 SO 问题的回答: nvarchar (Unicode) 列的 COLLATIONS 有什么意义?
不幸的是,二进制排序规则与区分大小写排序规则相同的概念非常普遍。
但是,它们在功能上非常不等效。有四个方面可以看出行为差异(我知道至少有四个):
组合字符
考虑使用小写字母
ü
(“u”与分音符号)和大写字母Ü
(“U”与分音符号)。这两种归类都将能够区分它们。现在,考虑有一个大写字母
U
和一个̈
(组合分音符号)。当组合字符放在非重音之后U
,你得到Ü
. 从视觉上看,它与单曲Ü
(带有分音符号的“U”)相同。并且区分大小写(甚至区分重音)的排序规则看起来它们是相同的,即使一个是单个代码点而另一个是两个代码点的组合。但是二进制排序规则无法将它们比较为相等,因为它们不是相同的代码点(甚至是相同数量的代码点)。全角字符
区分大小写但不区分宽度的排序规则将能够等同于
=o=
和=o=
。但是,由于它们是不同的代码点,因此二进制排序规则看起来并不相同。口音不敏感
区分大小写但不区分重音的排序规则将能够等同于
o
andô
。但是,由于它们是不同的代码点,因此二进制排序规则看起来并不相同。排序
区分大小写的排序规则将在其
~
前后排序。但是,二进制排序规则会将这些相同的字符排序为:then 。a
A
A
a
~
所有这些都记录在我的以下帖子中:
不,二进制排序规则不区分大小写
它以 Microsoft SQL Server 的形式呈现,但其行为基于 Unicode 标准定义的规则,这些规则在 RDBMS、语言、操作系统等之间应该是相同的(由于正在使用的 Unicode 标准版本不同,略有差异)使用,以及谁来实现,因为 Unicode 只是一个标准,并且在不同供应商之间实现了细微的差异)。
我的猜测是“通用”排序规则已经过时,并已被更新的“unicode”和特定于文化的排序规则所取代。文档(在页面的中间,以“ For any Unicode character set, ”开头的段落)甚至指出:
“unicode”排序规则可能是默认的排序权重和排序规则。特定于文化的排序规则为该文化定制权重和规则以使其正确(当默认值不正确时)。有关为什么有不同排序规则的更多信息,请参阅我对以下 SO 问题的回答:
nvarchar (Unicode) 列的 COLLATIONS 有什么意义?