utf8_general_ci和utf8_unicode_ci有什么区别?

91

可能重复:
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 之间的区别?在设计数据库时选择其中一个会产生什么影响呢?

请参见https://dev59.com/bnRA5IYBdhLWcg3w9izq。 - unor
2个回答

148

utf8_general_ci是一个非常简单的排序规则,对于通用的Unicode文本,它会得出不正确的结果。它所做的是:

  • 将文本转换为规范分解的Unicode标准形式D
  • 删除任何组合字符
  • 将文本转换为大写字母。

由于它无法理解Unicode大小写,因此在Unicode上无法正确工作。Unicode大小写本身要比ASCII思维方式能够处理的复杂得多。例如:

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

还有许多其他微妙之处。

  1. utf8_unicode_ci使用标准的Unicode Collation Algorithm,支持所谓的扩展和连字,例如: 德语字母ß(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

1
列表语言的道具 - reconbot
4
看起来这个答案是直接从mysql论坛http://forums.mysql.com/read.php?103,187048,188748#msg-188748复制的。 - Matt
23
即使你复制/粘贴答案,也不妨引用原始来源 :) - Matt
2
你为什么会想要使用 utf8_general_ci 而不是 utf8_unicode_ci 呢? - Buns Glazing
3
不要使用 utf8_general_ci https://dev59.com/bnRA5IYBdhLWcg3w9izq#766996 - Arda
显示剩余3条评论

21

来自MySQL文档中的Unicode字符集

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接