UTF-8:将军? 滨? Unicode的? UTF-8:将军? 滨? Unicode的?

2019-05-09 04:39发布

我试图找出我应该使用不同类型的数据整理东西。 我将存储所述内容的100%是用户提交。

我的理解是,我应该使用UTF-8通用CI(不区分大小写),而不是UTF-8二进制。 但是,我无法找到UTF-8一般CI和UTF-8的Unicode CI之间有明显的区别。

  1. 我应该是存储UTF-8通用或UTF-8的Unicode CI列用户提交的内容?
  2. 将UTF-8的数据类型的二进制适用于?

Answer 1:

在一般情况下,utf8_general_ciutf8_unicode_ci快,但不正确的。

这里的区别是:

对于任何Unicode字符集, 操作使用_general_ci整理比对_unicode_ci整理更快地执行 。 例如,对于utf8_general_ci整理是比较快的,但稍显不足正确的,比utf8_unicode_ci比较。 这样做的原因是,utf8_unicode_ci支持映射如膨胀; 也就是说,当一个字符作为比较等于的其它字符的组合。 例如,在德国和其他一些语言的“SS”等于“SS”。 utf8_unicode_ci还支持收缩和忽略的人物。 utf8_general_ci是一个遗留的排序规则,不支持扩展,收缩,或忽略的人物。 它可以使字符之间只有一个一对一的比较。

:引自http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

如需更详细的说明,请参阅从MySQL论坛下面的帖子: http://forums.mysql.com/read.php?103,187048,188748

至于utf8_bin:两个utf8_general_ciutf8_unicode_ci执行区分大小写的比较。 在constrast,utf8_bin是大小写敏感的 (其他差异之间),因为它比较字符的二进制值。



Answer 2:

你也应该知道这样一个事实,即与utf8_general_ci当使用VARCHAR字段作为唯一或主要指标将2个值像“a”和“A”将给一个重复键错误。



Answer 3:

  • utf8_bin比特盲目地进行比较。 没有折叠的情况下,没有口音剥离。
  • utf8_general_ci一个字节一个字节相比较。 它情况下,折叠口音汽提,但没有2字符comparisions: ij不等于ij在此归类。
  • utf8_*_ci是一组特定语言的规则,但在其他方面一样unicode_ci 。 一些特殊情况: ÇČchll
  • utf8_unicode_ci遵循比较旧的Unicode标准。 ij = ij ,但ae != æ
  • utf8_unicode_520_ci如下一个较新的Unicode标准。 ae = æ

见核对表的细节是什么在不同的UTF8归类等于什么。

utf8由MySQL所定义被限制为1到3字节UTF8码。 这留下了表情符号和一些中国的。 所以,你真的应该切换到utf8mb4如果要大大超过欧洲。

以上几点适用于utf8mb4 ,之后适合的拼写变化。 展望未来, utf8mb4utf8mb4_unicode_520_ci是首选。

  • UTF16和UTF32上UTF8变体; 所以实际上没有使用它们。
  • UCS2更接近“的Unicode”比“UTF8”; 所以实际上用不到它。


Answer 4:

说真的,我测试节约像具有唯一索引列“e”和“e”的价值观,他们会在两个“utf8_unicode_ci”和“utf8_general_ci”重复的错误。 你只能在“utf8_bin”整理列保存。

和MySQL文档(在http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html )建议到它的例子设置“utf8_general_ci”整理。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci


Answer 5:

接受的答案是过时的。

如果你使用MySQL 5.5.3+,用utf8mb4_unicode_ci代替utf8_unicode_ci ,以确保您的用户键入的字符不会给你的错误。

utf8mb4支持例如表情符号,而utf8可能会给你几百个像编码相关的bug:

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1



文章来源: UTF-8: General? Bin? Unicode?