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

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

我应该以utf-8常规或utf-8 Unicode CI列存储用户提交的内容吗?

UTF-8二进制文件适用于什么类型的数据?

旁注,但不要使用utf8,而是使用utf8mb4来完全支持UTF-8。在这里评论是因为这个流行问题的答案不能解决这个问题。mathiasbynens.be/notes/mysql-utf8mb4

如果您想要折叠大小写,但区分重音,请在bugs.mysql.com上提交请求。

或者点击bugs.mysql.com/bug.php上的"影响我"?ID=58797并添加注释。

一般来说,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是区分大小写的(还有其他区别),因为它比较字符的二进制值。

我认为如果你没有充分的理由使用unicode-ci,那么就使用general-ci。

但这并不能真正深入地回答这个问题。这些排序规则到底有什么区别?

你是对的,为了简单起见,这里没有提供确切的区别。我添加了一个链接到一个完全不同的帖子。

nb show collation;允许您查看每个字符集的默认排序规则。5.1显示utf8_general_ci为utf8的默认值。

在两个排序规则之间的实际速度差中,是否有任何资源可以进行更深入的分析?我们说的是性能下降0.1%还是下降10%?

utf8 bin排序规则是否意味着精确的二进制匹配?

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

谢谢,这对于避免类似的用户名很有用(例如,如果存在"jos e",我不希望其他人创建"jos&233;"用户)。注意:这对于大多数utf8排序也适用(utf8_u bin除外)。最可靠/最安全/最全面的是utf8_unicode_ci。

我在索引中要区分jose和jos&;的地方使用utf8 bin。例如,记录搜索/替换操作的列,在该列中,用户可能决定搜索jos&233;,并将其替换为jose。(我正在写电子表格程序)

utf8_bin盲目比较位。不折叠箱子,不去除重音。

utf8_general_ci比较一个字节和一个字节。它可以折叠大小写和去除重音,但是没有2个字符的比较:在这个排序规则中,ij不等于?。

utf8_*_ci是一组特定于语言的规则,但与unicode_ci不同。一些特例:?、?、ch、ll。

utf8_unicode_ci遵循旧的Unicode比较标准。ij=?,但ae!=EDCOX1〔3〕

utf8_unicode_520_ci遵循更新的Unicode标准。ae=?。

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

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

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

utf16和utf32是utf8的变体;它们实际上没有用处。

ucs2比utf8更接近于"unicode";实际上它没有用处。

重新"保持调谐":8.0排序显示不同字符、双元音等在8.0 utf8mb4排序中的比较;utf8基本相同。

8.0排序的速度明显快于5.x。

实际上,我测试了在具有唯一索引的列中保存"_"和"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"排序规则。

[mysqld]

character-set-server=utf8

collation-server=utf8_general_ci

我做了一个快速的测试,它似乎是准确的。当涉及到列上的唯一键和带颚化符等的值时,两个排序规则的行为都相同。

@mirroredfate好吧,我应该在这里添加该列应该具有导致此错误的唯一索引。它在我的回答中暗示。

接受的答案已过时。

如果使用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