我试图找出我应该对各种类型的数据使用什么排序规则。我将存储的内容100%是用户提交的。
我的理解是,我应该使用UTF-8通用CI (大小写不敏感),而不是UTF-8二进制。但是,我无法清楚地区分UTF-8通用CI和UTF-8 Unicode CI.
发布于 2010-02-26 19:07:01
一般来说,utf8_general_ci比utf8_unicode_ci快,但不太正确。
以下是不同之处:
对于任何Unicode字符集,使用排序规则执行的_general_ci操作比对_unicode_ci排序规则执行的操作要快。例如,对utf8_general_ci排序规则的比较比对utf8_unicode_ci的比较更快,但稍微不正确。这是因为utf8_unicode_ci支持扩展等映射;也就是说,当一个字符与其他字符的组合相比较时。例如,在德语和其他一些语言中,“some”等于“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_ci和utf8_unicode_ci都执行不区分大小写的比较.在constrast中,utf8_bin是区分大小写的(以及其他差异),因为它比较字符的二进制值。
发布于 2011-01-19 14:11:30
您还应该注意到,对于utf8_general_ci,当使用varchar字段作为唯一索引或主索引时,插入'a‘和'á’这样的2个值会导致重复的键错误。
发布于 2016-07-29 17:54:16
utf8_bin盲目地比较比特。没有折叠,没有脱口口音。utf8_general_ci比较了一个码点和一个码点。它做大小写折叠和重音剥离,但没有两个字符的比较;例如:在这个排序规则中,ij并不等于ij。utf8_*_ci是一组特定于语言的规则,但与unicode_ci不同.一些特例:Ç,Č,ch,llutf8_unicode_ci遵循传统的Unicode标准进行比较。ij=ij,但ae != æutf8_unicode_520_ci遵循较新的Unicode标准。ae = æ有关在各种校对图排序规则中什么等于什么的详细信息,请参见utf8。
utf8,如MySQL所定义的,仅限于1到3字节的utf8代码.这就忽略了鄂莫吉和一些中国人。所以,如果你想要超越欧洲的话,你真的应该改用utf8mb4。
以上各点适用于utf8mb4,经过适当的拼写更改。展望未来,utf8mb4和utf8mb4_unicode_520_ci是首选。
https://stackoverflow.com/questions/2344118
复制相似问题