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

Dol*_*lph 271 mysql collation utf-8

我试图找出我应该用于各种类型数据的排序规则.我将存储的100%内容是用户提交的.

我的理解是我应该使用UTF-8通用CI(Case-Insensitive)而不是UTF-8 Binary.但是,我无法找到UTF-8 General CI和UTF-8 Unicode CI之间的区别.

  1. 我应该将用户提交的内容存储在UTF-8 General或UTF-8 Unicode CI列中吗?
  2. UTF-8二进制适用于哪种类型的数据?

Sag*_*agi 293

通常,utf8_general_ciutf8_unicode_ci快,但不太正确.

这是区别:

对于任何Unicode字符集,使用_general_ci排序规则执行的操作比_unicode_ci排序规则更快.例如,与utf8_unicode_ci的比较相比,utf8_general_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_ciutf8_unicode_ci都执行不区分大小写的比较.相反,utf8_bin区分大小写(以及其他差异),因为它比较了字符的二进制值.

  • 是否有任何资源可以更深入地考虑两种排序规则之间的实际速度差异?我们是在谈论性能下降0.1%还是下降10%? (8认同)
  • 尽管如此,这并没有真正回答这个问题.*这些整理有什么区别?* (4认同)
  • 你是对的,为了简单起见,这里没有提供确切的区别.我添加了一个带有*exact*差异的帖子的链接. (3认同)
  • 我认为如果你没有充分的理由使用_unicode_ci,那么使用_general_ci. (2认同)

小智 89

您还应该注意这样一个事实:当使用varchar字段作为唯一或主索引时,使用utf8_general_ci插入2个值(如'a'和'á')会产生重复键错误.

  • 谢谢,这有助于避免类似的用户名(例如,如果"jose"存在,我不希望其他人创建"josé"用户)注意:这也适用于大多数utf8排序规则(utf8_bin除外).最可靠/最安全/最全面的是`utf8_unicode_ci` (3认同)
  • 我使用utf8_bin,我希望在索引中区分jose和josé.例如,记录搜索/替换操作的列,用户可能已决定搜索josé,并将其替换为jose.(我正在写一个电子表格程序) (2认同)

Ric*_*mes 28

  • utf8_bin盲目地比较这些比特.没有折叠的情况下,没有重点剥离.
  • utf8_general_ci比较一个字节和一个字节.它会进行大小写折叠重音剥离,但没有2个字符的比较:在此排序规则中ij不相同?.
  • utf8_*_ci是一组特定于语言的规则,但另有说法unicode_ci.一些特殊情况:Ç,?,ch,ll
  • utf8_unicode_ci遵循旧的Unicode标准进行比较.ij= ?,但是ae!=æ
  • utf8_unicode_520_ci遵循较新的Unicode标准. ae=æ

有关与各种utf8排序规则相同的详细信息,请参阅排序规则图表.

utf8,由MySQL定义仅限于1到3字节的utf8代码.这遗漏了表情符号和一些中文.所以utf8mb4如果你想远远超越欧洲,你应该切换到.

utf8mb4在适当的拼写更改后,以上几点适用.前进,utf8mb4并且utf8mb4_unicode_520_ci是首选.

  • utf16和utf32是utf8的变体; 对他们几乎毫无用处.
  • ucs2比"utf8"更接近"Unicode"; 几乎没有用它.


小智 7

接受的答案已过时。

如果您使用 MySQL 5.5.3+,请使用utf8mb4_unicode_ci而不是utf8_unicode_ci确保您的用户输入的字符不会给您错误。

utf8mb4例如,支持表情符号,而utf8可能会给您带来数百个与编码相关的错误,例如:

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1


vit*_*lii 6

实际上,我在具有唯一索引的列中测试了像'é'和'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
Run Code Online (Sandbox Code Playgroud)