我有两个unicode选项,它们看起来都适用于MySQL数据库。
utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive
请您解释一下 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 之间的区别?在设计数据库时选择其中一个会产生什么影响呢?utf8_general_ci
是一个非常简单的排序规则,对于通用的Unicode文本,它会得出不正确的结果。它所做的是:
由于它无法理解Unicode大小写,因此在Unicode上无法正确工作。Unicode大小写本身要比ASCII思维方式能够处理的复杂得多。例如:
还有许多其他微妙之处。
utf8_unicode_ci
使用标准的Unicode Collation Algorithm,支持所谓的扩展和连字,例如:
德语字母ß(U+00DF LETTER SHARP S)排序接近“ss”
字母Œ(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
,除非你想要错误的答案。utf8_general_ci
而不是 utf8_unicode_ci
呢? - Buns Glazingutf8_general_ci
https://dev59.com/bnRA5IYBdhLWcg3w9izq#766996 - Arda来自MySQL文档中的Unicode字符集:
对于任何Unicode字符集,使用
_general_ci
排序规则执行的操作比使用_unicode_ci
排序规则执行的操作更快。例如,utf8_general_ci
排序规则的比较速度更快,但比utf8_unicode_ci
排序规则略微不正确。原因是utf8_unicode_ci
支持映射,例如扩展;即当一个字符与其他字符的组合相等时。例如,在德语和一些其他语言中,“ß
”等于“ss
”。utf8_unicode_ci
还支持缩写和可忽略字符。utf8_general_ci
是一个传统的排序规则,不支持扩展、缩写或可忽略字符。它只能在字符之间进行一对一的比较。