8:一般? 滨? Unicode的?
我试图弄清楚我应该使用什么样的排序来处理各种类型的数据。 我将要存储的100%内容是用户提交的。
我的理解是我应该使用UTF-8 General CI(不区分大小写)而不是UTF-8 Binary。 但是,我无法找到UTF-8通用CI和UTF-8 Unicode CI之间的明显区别。
通常,utf8_general_ci比utf8_unicode_ci更快,但不太正确。
以下是区别:
对于任何Unicode字符集, 使用_general_ci排序规则执行的操作比_unicode_ci排序规则更快 。 例如,比较utf8_general_ci排序比较比utf8_unicode_ci更快,但稍微不准确。 原因是utf8_unicode_ci支持扩展等映射。 也就是说,当一个字符比较与其他字符的组合相等时。 例如,在德语和其他一些语言中,“ß”等于“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都执行不区分大小写的比较。 相反, utf8_bin区分大小写 (其他区别),因为它会比较字符的二进制值。
你还应该知道这样一个事实:使用utf8_general_ci时,如果使用varchar字段作为唯一索引或主索引,插入2个值(如'a'和'á')会导致重复键错误。
utf8_bin
比较盲目的位。 没有折叠,没有口音剥离。 utf8_general_ci
比较一个字节和一个字节。 它情况下,折叠和口音汽提,但没有2字符comparisions: ij
不等于ij
在此归类。 utf8_*_ci
是一组特定于语言的规则,但是与unicode_ci
类似。 一些特殊情况: Ç
, Č
, ch
, ll
utf8_unicode_ci
遵循旧的Unicode标准进行比较。 ij
= ij
,但是ae
!= æ
utf8_unicode_520_ci
遵循更新的Unicode标准。 ae
= æ
有关什么与各种utf8归类中的内容相同的详细信息,请参阅归类表。
由MySQL定义的utf8
仅限于1到3字节的utf8代码。 这留下了表情符号和一些中国人。 所以如果你想远远超过欧洲,你应该切换到utf8mb4
。
以上几点适用于utf8mb4
,经过适当的拼写更改。 展望未来,首选utf8mb4
和utf8mb4_unicode_520_ci
。
上一篇: 8: General? Bin? Unicode?
下一篇: What is Unicode, UTF