可能重复:utf8_general_ci和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有什么区别吗?在设计数据库时,选择其中一个会产生什么影响?
2 回答
utf8_general_ci
是一个非常简单的 - 在Unicode上,非常破碎 - 整理,一个在一般的Unicode文本上给出 incorrect results . 它的作用是:转换为Unicode规范化形式D,用于规范分解
删除任何组合字符
转换为大写
这在Unicode上无法正常工作,因为它不了解Unicode大小写 . 单独使用Unicode外壳比使用ASCII思想的方法要复杂得多 . 例如:
“ẞ”的小写字母是“ß”,但“ß”的大写字母是“SS” .
有两个小写的希腊sigma,但只有一个大写的;考虑“Σίσυφος” .
像“ø”这样的字母不会分解为“o”加上变音符号,这意味着它将无法正确排序 .
还有许多其他细微之处 .
utf8_unicode_ci
使用标准Unicode Collation Algorithm,支持所谓的扩展和连字,例如:德语字母ß(U 00DF LETTER SHARP S)在_1744793附近排序_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
来自MySQL documentation中的Unicode Character Sets: