Unicode 和丹麦语之间的 UTF8 排序规则差异

utf8 collation difference between unicode and danish

提问人:ThomasK 提问时间:5/14/2013 最后编辑:Developer Marius ŽilėnasThomasK 更新时间:12/4/2014 访问量:4105

问:

好吧,你好。 我正在将数据库的字符集从 更改为 。我一直在使用,因为它是最接近挪威角色风格的——我认为。
但是呢?
latin1_sweedish_ciutf8utf8_danish_ciutf8_general_ciutf8_unicode_ci

前段时间;它更倾向于用于更好/更快的性能,并且由于后者的排序算法更复杂,因此更准确地使用它。但是,由于速度/性能不再是问题 - 或者在大多数情况下不再是问题 - 在大多数情况下可以使用吗?_general_ci_unicode_ci_unicode_ci

但与 ?
是否考虑了北欧字母表中的最后三个字母 , ?
_unicode_ci_danish_ciæøå

我能找到的大多数比较(一个与另一个)仅在 和 之间。_general_ci_unicode_ci

任何知道何时使用或何时使用的例子将不胜感激......_unicode_ci_danish_ci

php mysql utf-8 字符编码

评论

2赞 deceze 5/14/2013
特定于语言的排序规则与这些语言对某些字符的首选排序顺序比较有关。我完全是编造的,因为我不懂丹麦语,但一般来说,“o”和“ø”被认为是两个不同的字符,而在丹麦语中,出于比较和排序的目的,它们被认为是相等的(想想电话簿顺序)。另一个例子是,在德语中,“ß”被认为等于“ss”。这能回答问题吗?danish
0赞 ThomasK 5/14/2013
不知道。由于是丹麦语中的一个常见字母,我认为这两个字母会被区别对待......另一方面,这两个字母将被视为相等的字母,而 in - 也许不会再......但我不确定。ø_general_ciunicode_ci
0赞 deceze 5/14/2013
好吧,再说一次,我不完全确定什么被认为是平等的,我只是为了比较而编造的。不过,这有帮助吗?您可以在某处的文档中查找确切的规则;或者确切的规则是你所要求的吗?
0赞 ThomasK 5/14/2013
我想看看我是否有任何理由使用而不是 或 .两者都有 ,但没有 ..._danich_ci_unicode_ci_general_ci_swedish_ci_danish_ci_norwegian_ci
0赞 Alix Axel 5/14/2013
@ThomasK:en.wikipedia.org/wiki/Danish_and_Norwegian_alphabet = 相同。

答:

-1赞 Alix Axel 5/14/2013 #1

我不是 100% 确定,但我相信这是(任一)(排序规则)的子集。utf8_danish_ciutf8

话虽如此,如果您的数据库是编码的,那么使用丹麦语排序规则就没有意义了。utf8

快速测试(因为我很匆忙,我找不到排序规则列表):utf8_unicode

  • 使用排序规则创建包含所有这些字符(小写和大写)的表utf8_danish_ci
  • 选择所有记录,按 char ASC 排序
  • 将表格的排序规则更改为或最好utf8_general_ciutf8_unicode_ci
  • 如果字符在两个查询中的顺序相同,则选择其中任何一个都不会产生任何影响

相关链接


更新

我的假设是错误的。

我做了一些测试,显然没有按相同的顺序排序,所以没关系。utf8_unicode_ci

评论

2赞 deceze 5/14/2013
utf8_danish_ci不是 的“子集”。听起来您混淆了编码排序规则。编码是一个集合,因此一个可能是另一个的子集。排序规则只是比较规则utf8
0赞 ThomasK 5/14/2013
由于排序规则仅涉及字符之间的比较,因此字符本身的输出在其中任何一个中都是相同的。意义;在输出文本时,例如文章等,我使用哪一个并不重要。但是对于对任何内容进行排序 - 它可能会有所作为......正确?
0赞 Alix Axel 5/14/2013
@deceze:我想说的是,排序规则是 并且可能也是 的一个子集。utf8_danish_ciutf8_unicode_ciutf8_general_ci
0赞 Alix Axel 5/14/2013
@ThomasK:100%正确:它可以,并不意味着它会。为此,您必须获取两个排序规则字符列表,并查看丹麦字符在两个排序规则中是否以相同的顺序显示。或者,您可以运行我在答案中提到的测试 - 您将得到相同的答案。
0赞 RandomSeed 5/14/2013
-1 排序规则不是一个集合,它不能是一个子集。如果要呈现丹麦语文本(例如丹麦语词典),则使用丹麦语排序规则是有意义的。
2赞 RandomSeed 5/14/2013 #2

请记住,Collation != Encoding.

编码是整数(数据库在一天结束时可以存储的所有整数)和人类可读的字符图形表示之间的映射。

排序规则是用于根据给定语言的常规字母顺序对字符进行排序的排序规则。请注意,此排序并不反映内部数值表示的实际顺序。

您的问题可以归结为以下几点:您应该在应用程序中使用什么样的字母顺序?这是无法回答的。

评论

0赞 Alix Axel 5/14/2013
-1,可以回答...假设该应用程序主要用于存储丹麦语文本,然后选择 .然而,Iff(也许[令人怀疑]甚至)以相同的顺序对相同的丹麦文本进行排序(换句话说,如果它扩展了丹麦语排序规则),那么为了获得更完整的排序规则而使用,并且还能够正确地对其他语言的文本进行排序<在那里。utf8_danish_ciutf8_unicode_ciutf8_general_ciutf8_unicode_ci
1赞 RandomSeed 5/14/2013
@AlixAxel 如果你的假设是正确的,这可能是真的。但是,我仍然找不到哪条线索可能表明一般校勘系统扩展了丹麦语校勘标准。您似乎也忘记了,可以根据当下的需要即时更改排序规则,而无需支付任何费用。你也许应该重新表述你的第一个假设:“假设应用程序主要用于呈现丹麦语文本”。
0赞 ThomasK 5/14/2013
我可以补充;我需要将挪威语文本存储在数据库中,而不是丹麦语。由于没有挪威的替代品,我一直在使用丹麦语搭配。主要是因为我不知道什么是unicode或general,因为它是最接近挪威语的语言。
0赞 Alix Axel 5/14/2013
@YaK:“假设应用程序主要用于呈现丹麦语文本”——如果不是,OP 为什么要考虑该语言环境?我坚持我所说的话。
1赞 Alix Axel 5/14/2013
@ThomasK:“但请记住,排序规则对存储没有任何影响。编码有“——我刚刚知道这不是真的。尝试在这个(sqlfiddle.com/#!2/ca397/1/0)与这个(sqlfiddle.com/#!2/4ca84/1/0)中找到。Å
7赞 Denis de Bernardy 5/14/2013 #3

简而言之,如果你的应用程序是多语言的,并且在同一表中存储多种语言,那么你大部分时间都搞砸了,应该担心数据库之外的排序/整理——utf8_general_ci和其他任何语言一样好。

如果它只支持一种语言,你可以通过在数据库级别设置正确的排序规则来做得很好——在你的情况下,utf8_danish_ci确实如此,因为如果维基百科是可以参考的,它与挪威语是一样的。

如果您想阅读更多关于整理的信息,ICU 文档中有丰富多彩的例子来说明这种东西有多棘手。广泛引用:

http://userguide.icu-project.org/collation

[H]以下是语言在对字符串进行排序方面有所不同的一些方式:

字母 A-Z 的排序顺序与英文不同。 例如,在立陶宛语中,“y”在“i”和“k”之间排序。

字母组合可以被视为一个字母。为 例如,在传统的西班牙语中,“ch”被视为一个字母, 并在“C”和“D”之间排序。

重音字母可以被视为无重音字母的次要变体 信。例如,“é”可以等同于“e”。

重音字母可以被视为不同的字母。例如,“Å” 在丹麦语中被视为一个单独的字母,在“Z”之后排序。

在一种语言中被认为是不同的无重音字母可以是 在另一个中模糊不清。例如,字母“v”和“w”是两个 根据英语的不同字母。但是,“v”和“w”是 被认为是瑞典语中同一字母的变体形式。

一个字母可以被视为两个字母。例如,在 传统的德语“ä”被比较为“ae”。

泰语要求某些字母的顺序颠倒。

法语要求字母在末尾用重音排序 字符串在字符串开头的重音符号之前排序。为 例如,单词“côte”排序在“coté”之前,因为尖锐的口音 在最后的“e”上比在“o”上的回旋更重要。

有时小写字母排序在大写字母之前。反之亦然 在其他情况下是必需的。例如,小写字母是 通常在英语中排序在大写字母之前。拉脱维亚字母 恰恰相反。

即使使用相同的语言,不同的应用程序也可能需要 不同的排序顺序。例如,在德语词典中,“öf” 将出现在“的”之前。在电话簿中,情况是确切的 相反。

分拣顺序可能会因政府法规或 Unicode 中的新字符/脚本。

评论

0赞 Alix Axel 5/14/2013
+1,好答案。(或 unicode 变体)总是和其他任何变体一样好吗?utf8_general_ci
0赞 Denis de Bernardy 5/15/2013
恕我直言,是的。即使是老练的软件工程师也无法完全理解按“正确”顺序对单词进行排序的微妙之处(或好处)。许多人依赖 c 字符串排序,因为它更简单。所以我建议门槛足够低,任何事情都可能发生......
0赞 Collector 12/4/2014
您可以轻松地将 COLLATE 添加到每个相关查询中,请参阅我的答案。
-1赞 Collector 12/4/2014 #4

排序规则决定了哪些字符可以存储在表中,以及字符的顺序。选择以 utf8 开头的任何内容都应该满足字符存储的大部分需求utf8_general_ci因此是一个不错的选择。如果您要专注于一种语言,则可以选择本地排序规则,例如 utf8_danish_ci,这意味着顺序将是丹麦字符且不区分大小写(ci 部分)。

对于多语言应用程序,您可以存储具有utf8_general_ci的字段,当您需要特定的排序或比较以匹配您的首选语言时,请使用您的首选排序规则将 COLLATE 单词添加到查询中 https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-sets.html

根据我的经验,上面@Denis提供的答案,声称您无法在MySQL中排序,这是错误的。

评论

0赞 Denis de Bernardy 12/4/2014
不过,你没有回答这个问题。OP 询问一种排序规则与另一种排序规则有何不同,据我所知,我尽可能诚实地回答:排序规则不同。你对一个(诚实的)答案投反对票的意义是什么,它突出了它的不同之处?
0赞 Collector 12/4/2014
由于您的第一段,我认为就我使用 php/MySQL 编写国际化应用程序的经验而言,我对您的答案投了反对票,该段落具有高度误导性和不正确:“如果您的应用程序是多语言的并且在同一表中存储多种语言,那么您大多被搞砸了,应该担心在数据库之外进行排序/整理”。互惠否决票?哇,这太成熟了。我会改进我的答案。
0赞 Denis de Bernardy 12/4/2014
“对等否决票?”你不是在回答OP的问题;不要再看了。顺便说一句,我绝不是说你根本无法在MySQL中排序。我确实根据经验声称这是不切实际的(例如,以适当的方式命名一些支持 COLLATE 的 ORM),并且文本字段的编码(注意编码 != 排序规则)在包含具有本质不同排序规则的多种语言的文本时是无关紧要的——因为无论如何你都需要覆盖它。因此,和任何一样好。utf8_general_ci
0赞 Collector 12/4/2014
我的回答第一段清楚地回答了OP的问题“但是_unicode_ci与_danish_ci有什么不同?根据我的经验,使用 COLLATE 对多种语言进行排序是非常实用的。它可以直接完成,也可以通过 ORM 完成,我已经用 Doctrine 完成了。显然编码 != 排序规则,但在 mysql 中,排序规则的第一部分似乎确实决定了字符集,正如我所解释的那样,您可以继续阅读 dev.mysql.com/doc/refman/5.6/en/charset-mysql.html