我试图找出我应该使用不同类型的数据整理东西。 我将存储所述内容的100%是用户提交。
我的理解是,我应该使用UTF-8通用CI(不区分大小写),而不是UTF-8二进制。 但是,我无法找到UTF-8一般CI和UTF-8的Unicode CI之间有明显的区别。
- 我应该是存储UTF-8通用或UTF-8的Unicode CI列用户提交的内容?
- 将UTF-8的数据类型的二进制适用于?
我试图找出我应该使用不同类型的数据整理东西。 我将存储所述内容的100%是用户提交。
我的理解是,我应该使用UTF-8通用CI(不区分大小写),而不是UTF-8二进制。 但是,我无法找到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”等于“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是大小写敏感的 (其他差异之间),因为它比较字符的二进制值。
你也应该知道这样一个事实,即与utf8_general_ci当使用VARCHAR字段作为唯一或主要指标将2个值像“a”和“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归类等于什么。
utf8
, 由MySQL所定义被限制为1到3字节UTF8码。 这留下了表情符号和一些中国的。 所以,你真的应该切换到utf8mb4
如果要大大超过欧洲。
以上几点适用于utf8mb4
,之后适合的拼写变化。 展望未来, utf8mb4
和utf8mb4_unicode_520_ci
是首选。
说真的,我测试节约像具有唯一索引列“e”和“e”的价值观,他们会在两个“utf8_unicode_ci”和“utf8_general_ci”重复的错误。 你只能在“utf8_bin”整理列保存。
和MySQL文档(在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
接受的答案是过时的。
如果你使用MySQL 5.5.3+,用utf8mb4_unicode_ci
代替utf8_unicode_ci
,以确保您的用户键入的字符不会给你的错误。
utf8mb4
支持例如表情符号,而utf8
可能会给你几百个像编码相关的bug:
Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1