UTF-8: General? Bin? Unicode?
我正在试图找出我应该为各种类型的数据使用什么排序规则。我将存储的100%内容是用户提交的。
我的理解是我应该使用UTF-8通用CI(不区分大小写)而不是UTF-8二进制。但是,我无法在utf-8常规CI和utf-8 Unicode CI之间找到明确的区别。
一般来说,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 不同。一些特例:? 、? 、ch 、ll 。utf8_unicode_ci 遵循旧的Unicode比较标准。ij =? ,但ae !=EDCOX1〔3〕utf8_unicode_520_ci 遵循更新的Unicode标准。ae =? 。
有关不同utf8排序规则中的内容相等的详细信息,请参阅排序规则图表。
mysql定义的
以上几点适用于经过适当的拼写更改后的
- 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+,请使用
例如,