可能重复:
What's the difference between utf8_general_ci and utf8_unicode_ci
我有两个unicode选项,看起来很有希望成为一个mysql数据库。
utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive
请解释一下utf8_general_ci和utf8_unicode_ci有什么区别?在设计数据库时,选择一个比另一个有什么影响?
答案 0 :(得分:128)
utf8_general_ci
非常简单 - 在Unicode上非常破碎 - 整理,在一般Unicode文本上提供错误结果。它的作用是:
这在Unicode上无法正常工作,因为它不了解Unicode大小写。单独使用Unicode外壳比使用ASCII编程的方法要复杂得多。例如:
还有许多其他细微之处。
utf8_unicode_ci
使用标准Unicode Collation Algorithm,支持所谓的扩展和连字,例如:
德语字母ß(U + 00DF LETTER SHARP S)在“ss”附近排序
LetterŒ(U + 0152 LATIN CAPITAL LIGATURE OE)在“OE”附近排序。 utf8_general_ci
不支持扩展/连字,它排序
所有这些字母都是单个字符,有时候是错误的顺序。
utf8_unicode_ci
通常更准确。
例如,在西里尔文块上:
utf8_unicode_ci
适用于所有这些语言:
俄语,保加利亚语,白俄罗斯语,马其顿语,塞尔维亚语和乌克兰语。
虽然utf8_general_ci仅适用于俄罗斯和保加利亚语的西里尔语。
白俄罗斯语,马其顿语,塞尔维亚语和乌克兰语中使用的额外字母
排序不好。 utf8_unicode_ci
的费用是小位
慢于utf8_general_ci
。但这是你为正确性付出的代价。要么你能得到一个错误的快速回答,要么是一个非常慢的答案,这是正确的。你的选择。
很难给出错误的答案,因此最好假设utf8_general_ci
不存在并始终使用utf8_unicode_ci
。好吧,除非你想要错误的答案。
来源:http://forums.mysql.com/read.php?103,187048,188748#msg-188748
答案 1 :(得分:19)
来自Unicode Character Sets中的MySQL documentation:
对于任何Unicode字符集,使用
_general_ci
排序规则执行的操作比_unicode_ci
排序规则的操作更快。例如,与utf8_general_ci
的比较相比,utf8_unicode_ci
整理的比较更快,但更不正确。原因是utf8_unicode_ci
支持扩展等映射;也就是说,当一个字符与其他字符的组合相等时。例如,在德语和其他一些语言中,“ß
”等于“ss
”。utf8_unicode_ci
也支持收缩和可忽略的角色。utf8_general_ci
是一种遗留的排序规则,不支持扩展,收缩或可忽略的字符。它只能在字符之间进行一对一的比较。