utf8_general_ci和utf8_unicode_ci之间的差异是什么?

rec*_*bot 83 mysql unicode character-encoding

可能重复:
utf8_general_ci和utf8_unicode_ci之间有什么区别

我有两个unicode选项,看起来很有希望用于mysql数据库.

utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive
Run Code Online (Sandbox Code Playgroud)

你能解释一下utf8_general_ci和utf8_unicode_ci有什么区别吗?在设计数据库时,选择其中一个会产生什么影响?

Tim*_*tei 131

utf8_general_ci是一个非常简单的 - 并且在Unicode上,非常破碎 - 整理,在一般的Unicode文本上给出错误的结果.它的作用是:

  • 转换为Unicode规范化形式D,用于规范分解
  • 删除任何组合字符
  • 转换为大写

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

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

还有许多其他细微之处.

  1. utf8_unicode_ci使用标准的Unicode校对算法,支持所谓的扩展和连字,例如:德语字母ß(U + 00DF LETTER SHARP S)在"ss"附近排序.字母Œ(U + 0152 LATIN CAPITAL LIGATURE OE)在"OE"附近排序".

utf8_general_ci 不支持扩展/连字,它将所有这些字母排序为单个字符,有时排序错误.

  1. 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

  • 复制/粘贴答案时,不会阻止您引用原始来源:P (19认同)
  • 看起来这个答案是从mysql论坛直接复制的http://forums.mysql.com/read.php?103,187048,188748#msg-188748 (3认同)
  • 你为什么要在`utf8_unicode_ci`上使用`utf8_general_ci`呢? (2认同)
  • 永远不要使用`utf8_general_ci` [http://stackoverflow.com/a/766996/570763 ](http://stackoverflow.com/a/766996/570763) (2认同)

Gum*_*mbo 20

MySQL文档中的Unicode字符集:

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