4

你好。我正在将数据库的字符集从 更改latin1_sweedish_ciutf8. 我一直使用utf8_danish_ci它,因为它最接近挪威的字符风格——我想。
但是utf8_general_ciutf8_unicode_ci呢?

前一段时间; 由于排序算法在后者中更复杂,因此首选_general_ci用于更好/更快的性能和更高的准确性。_unicode_ci但是由于速度/性能不再是问题 - 或者在大多数情况下不再_unicode_ci是问题 - 在大多数情况下可以使用吗?

但与 有何_unicode_ci不同_danish_ci?是否考虑了北欧字母表中 的
最后三个字母æ, ?øå

我能找到的大多数比较(一个与另一个)只在_general_ci和之间_unicode_ci

任何知道何时使用_unicode_ci或何时使用的示例的人_danish_ci将不胜感激......

4

4 回答 4

7

简而言之,如果您的应用程序是多语言的并且在同一个表中存储多种语言,那么您大多会被搞砸,并且应该担心在数据库之外进行排序/整理 - utf8_general_ci 与其他任何语言一样好。

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

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

http://userguide.icu-project.org/collat​​ion

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

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

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

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

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

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

一个字母可以被视为两个字母。例如,在传统德语中,比较“ä”就好像它是“ae”。

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

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

有时小写字母排在大写字母之前。在其他情况下需要相反。例如,在英文中,小写字母通常排在大写字母之前。拉脱维亚字母正好相反。

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

由于政府法规或 Unicode 中的新字符/脚本,排序顺序可能会随着时间而改变。

于 2013-05-14T13:18:11.813 回答
2

请记住排序规则!= 编码。

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

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

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

于 2013-05-14T09:13:52.820 回答
-1

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

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

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

于 2014-12-03T18:58:29.097 回答
-1

我不是 100% 确定,但我相信它utf8_danish_ci是(或者)utf8(排序规则)的一个子集。

话虽如此,如果您的数据库已utf8编码,则使用丹麦排序规则几乎没有意义。

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

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

相关链接


更新

我的假设是错误的。

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

于 2013-05-14T09:05:39.850 回答