utf8_general_ci和utf8_unicode_ci有什么区别?

时间:2009-06-24 04:49:32

标签: mysql unicode character-encoding

  

可能重复:
  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有什么区别?在设计数据库时,选择一个比另一个有什么影响?

2 个答案:

答案 0 :(得分:128)

utf8_general_ci非常简单 - 在Unicode上非常破碎 - 整理,在一般Unicode文本上提供错误结果。它的作用是:

  • 转换为Unicode规范化形式D以进行规范分解
  • 删除任何组合字符
  • 转换为大写

这在Unicode上无法正常工作,因为它不了解Unicode大小写。单独使用Unicode外壳比使用ASCII编程的方法要复杂得多。例如:

  • “ẞ”的小写字母是“ß”,但“ß”的大写字母是“SS”。
  • 有两个小写的希腊语sigma,但只有一个大写的;考虑“Σίσυφος”。
  • 像“ø”这样的字母不会分解为“o”加上变音符号,这意味着它不能正确排序。

还有许多其他细微之处。

  1. utf8_unicode_ci使用标准Unicode Collation Algorithm,支持所谓的扩展和连字,例如: 德语字母ß(U + 00DF LETTER SHARP S)在“ss”附近排序 LetterŒ(U + 0152 LATIN CAPITAL LIGATURE OE)在“OE”附近排序。
  2. utf8_general_ci不支持扩展/连字,它排序 所有这些字母都是单个字符,有时候是错误的顺序。

      对于所有脚本,
    1. utf8_unicode_ci 通常更准确。 例如,在西里尔文块上: utf8_unicode_ci适用于所有这些语言: 俄语,保加利亚语,白俄罗斯语,马其顿语,塞尔维亚语和乌克兰语。 虽然utf8_general_ci仅适用于俄罗斯和保加利亚语的西里尔语。 白俄罗斯语,马其顿语,塞尔维亚语和乌克兰语中使用的额外字母 排序不好。
    2. 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是一种遗留的排序规则,不支持扩展,收缩或可忽略的字符。它只能在字符之间进行一对一的比较。