首页 文章

utf8_general_ci和utf8_unicode_ci之间的差异是什么? [重复]

提问于
浏览
76

可能重复: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 回答

  • 123

    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

  • 19

    来自MySQL documentation中的Unicode Character Sets

    对于任何Unicode字符集,使用_general_ci排序规则执行的操作比_unicode_ci排序规则更快 . 例如,与utf8_unicode_ci的比较相比,utf8_general_ci整理的比较更快,但更不正确 . 原因是utf8_unicode_ci支持扩展等映射;也就是说,当一个字符与其他字符的组合相等时 . 例如,在德语和其他一些语言中,“ß”等于“ss” . utf8_unicode_ci还支持收缩和可忽略的字符 . utf8_general_ci是一种遗留的排序规则,不支持扩展,收缩或可忽略的字符 . 它只能在字符之间进行一对一的比较 .

相关问题