关于mysql:UTF-8:General? Bin? Unicode?的区别

UTF-8: General? Bin? Unicode?

我正在试图找出我应该为各种类型的数据使用什么排序规则。我将存储的100%内容是用户提交的。

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

  • 我应该以utf-8常规或utf-8 Unicode CI列存储用户提交的内容吗?
  • UTF-8二进制文件适用于什么类型的数据?

  • 一般来说,utf8_-general_-ci比utf8_-unicode_-ci快,但不太正确。

    区别如下:

    For any Unicode character set, operations performed using the _general_ci collation are faster than those for the _unicode_ci collation. For example, comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci. The reason for this is that utf8_unicode_ci supports mappings such as expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages"?" is equal to"ss". utf8_unicode_ci also supports contractions and ignorable characters. utf8_general_ci is a legacy collation that does not support expansions, contractions, or ignorable characters. It can make only one-to-one comparisons between characters.

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

    有关更详细的解释,请阅读MySQL论坛的以下帖子:http://forums.mysql.com/read.php?103187048188748

    对于utf8_bin:utf8_-general_-ci和utf8_-unicode_-ci都执行不区分大小写的比较。在constrast中,utf8-bin是区分大小写的(还有其他区别),因为它比较字符的二进制值。


    您还应该了解这样一个事实,即当使用varchar字段作为唯一索引或主索引时,使用utf8_-general_-ci插入2个值(如"a"和"_")会产生重复的键错误。


    • utf8_bin盲目比较位。不折叠箱子,不去除重音。
    • utf8_general_ci比较一个字节和一个字节。它可以折叠大小写和去除重音,但是没有2个字符的比较:在这个排序规则中,ij不等于?
    • utf8_*_ci是一组特定于语言的规则,但与unicode_ci不同。一些特例:??chll
    • utf8_unicode_ci遵循旧的Unicode比较标准。ij=?,但ae!=EDCOX1〔3〕
    • utf8_unicode_520_ci遵循更新的Unicode标准。ae=?

    有关不同utf8排序规则中的内容相等的详细信息,请参阅排序规则图表。

    mysql定义的utf8仅限于1到3字节的utf8代码。这就省去了emoji和一些中文。所以,如果你想在欧洲以外走得更远,你真的应该转向utf8mb4

    以上几点适用于经过适当的拼写更改后的utf8mb4。今后,utf8mb4utf8mb4_unicode_520_ci是首选。

    • utf16和utf32是utf8的变体;它们实际上没有用处。
    • ucs2比utf8更接近于"unicode";实际上它没有用处。


    实际上,我测试了在具有唯一索引的列中保存"_"和"e"等值,它们会在"utf8_unicode_ci"和"utf8_general_ci"上导致重复错误。您只能将它们保存在"utf8_bin"排序列中。

    而mysql-docs(在http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html中)在其示例集中建议使用"utf8_-general_-ci"排序规则。

    1
    2
    3
    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci


    接受的答案已过时。

    如果使用mysql 5.5.3+,请使用utf8mb4_unicode_ci而不是utf8_unicode_ci,以确保用户键入的字符不会给您带来错误。

    例如,utf8mb4支持emojis,而utf8可能会给您提供数百个与编码相关的错误,如:

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