提问人:ThomasK 提问时间:5/14/2013 最后编辑:Developer Marius ŽilėnasThomasK 更新时间:12/4/2014 访问量:4105
Unicode 和丹麦语之间的 UTF8 排序规则差异
utf8 collation difference between unicode and danish
问:
好吧,你好。
我正在将数据库的字符集从 更改为 。我一直在使用,因为它是最接近挪威角色风格的——我认为。
但是呢?latin1_sweedish_ci
utf8
utf8_danish_ci
utf8_general_ci
utf8_unicode_ci
前段时间;它更倾向于用于更好/更快的性能,并且由于后者的排序算法更复杂,因此更准确地使用它。但是,由于速度/性能不再是问题 - 或者在大多数情况下不再是问题 - 在大多数情况下可以使用吗?_general_ci
_unicode_ci
_unicode_ci
但与 ?
是否考虑了北欧字母表中的最后三个字母 , ?_unicode_ci
_danish_ci
æ
ø
å
我能找到的大多数比较(一个与另一个)仅在 和 之间。_general_ci
_unicode_ci
任何知道何时使用或何时使用的例子将不胜感激......_unicode_ci
_danish_ci
答:
我不是 100% 确定,但我相信这是(任一)(排序规则)的子集。utf8_danish_ci
utf8
话虽如此,如果您的数据库是编码的,那么使用丹麦语排序规则就没有意义了。utf8
快速测试(因为我很匆忙,我找不到排序规则列表):utf8_unicode
- 使用排序规则创建包含所有这些字符(小写和大写)的表
utf8_danish_ci
- 选择所有记录,按 char ASC 排序
- 将表格的排序规则更改为或最好
utf8_general_ci
utf8_unicode_ci
- 如果字符在两个查询中的顺序相同,则选择其中任何一个都不会产生任何影响
相关链接。
更新
我的假设是错误的。
我做了一些测试,显然没有按相同的顺序排序,所以没关系。utf8_unicode_ci
评论
utf8_danish_ci
不是 的“子集”。听起来您混淆了编码和排序规则。编码是一个集合,因此一个可能是另一个的子集。排序规则只是比较规则。utf8
utf8_danish_ci
utf8_unicode_ci
utf8_general_ci
请记住,Collation != Encoding.
编码是整数(数据库在一天结束时可以存储的所有整数)和人类可读的字符图形表示之间的映射。
排序规则是用于根据给定语言的常规字母顺序对字符进行排序的排序规则。请注意,此排序并不反映内部数值表示的实际顺序。
您的问题可以归结为以下几点:您应该在应用程序中使用什么样的字母顺序?这是无法回答的。
评论
utf8_danish_ci
utf8_unicode_ci
utf8_general_ci
utf8_unicode_ci
Å
简而言之,如果你的应用程序是多语言的,并且在同一表中存储多种语言,那么你大部分时间都搞砸了,应该担心数据库之外的排序/整理——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 中的新字符/脚本。
评论
utf8_general_ci
排序规则决定了哪些字符可以存储在表中,以及字符的顺序。选择以 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中排序,这是错误的。
评论
utf8_general_ci
评论
danish
ø
_general_ci
unicode_ci
_danich_ci
_unicode_ci
_general_ci
_swedish_ci
_danish_ci
_norwegian_ci