UTF-8:一般? 滨? Unicode的?

我想弄清楚什么样的sorting规则我应该使用各种types的数据。 我将要存储的内容100%是用户提交的。

我的理解是我应该使用UTF-8通用CI(不区分大小写)而不是UTF-8 Binary。 但是,我无法在UTF-8 General CI和UTF-8 Unicode CI之间find明确的区别。

  1. 我应该将用户提交的内容存储在UTF-8 General或UTF-8 Unicode CI列中吗?
  2. UTF-8二进制文件适用于什么types的数据?

一般来说, utf8_general_ciutf8_unicode_ci快,但不太正确。

以下是区别:

对于任何Unicode字符集, 使用_general_cisorting规则执行的操作比_unicode_cisorting规则更快 。 例如,比较utf8_general_cisorting比较比utf8_unicode_ci更快,但是稍微不正确。 原因是utf8_unicode_ci支持扩展等映射。 也就是说,当一个字符比较等于其他字符的组合。 例如,在德语和其他一些语言中,“ß”等于“ss”。 utf8_unicode_ci也支持收缩和可忽略的字符。 utf8_general_ci是不支持扩展,缩小或可忽略字符的传统sorting规则。 它只能对字符进行一对一的比较。

引自: 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_ciutf8_unicode_ci执行不区分大小写的比较。 相反, utf8_bin区分大小写 (其他区别),因为它比较字符的二进制值。

你也应该知道这样一个事实,即当使用varchar字段作为唯一索引或主索引插入2个值(如'a'和'á')时,使用utf8_general_ci会导致重复键错误。

  • utf8_bin比较盲目的位。 没有折叠的情况下,没有口音剥离。
  • utf8_general_ci比较一个字节和一个字节。 它可以折叠重音剥离,但是没有两个字符的比较:在整理中, ij不相等。
  • utf8_*_ci是一组特定于语言的规则,但是与unicode_ci类似。 一些特殊情况: ÇČchll
  • utf8_unicode_ci遵循旧的Unicode标准进行比较。 ij = ij ,但是ae != æ
  • utf8_unicode_520_ci遵循一个更新的Unicode标准。 ae = æ

请参阅sorting图以获取有关各种utf8归类中的内容的详细信息。

由MySQL定义的 utf8仅限于1到3字节的utf8代码。 这留下了表情符号和一些中国人。 所以如果你想远远超过欧洲,你应该切换到utf8mb4

以上几点适用于utf8mb4 ,经过适当的拼写更改。 outlook未来, utf8mb4utf8mb4_unicode_520_ci是首选。

  • utf16和utf32是utf8上的变体; 他们几乎没有用处。
  • ucs2比“utf8”更接近“Unicode”; 它几乎没有用处。

实际上,我testing了像“é”和“e”这样的唯一索引列存储值,它们在“utf8_unicode_ci”和“utf8_general_ci”上都会导致重复的错误。 您只能将它们保存在“utf8_bin”分类列中。

和mysql文档(在http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html )build议在其示例中设置“utf8_general_ci”sorting规则。

 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci