我应该设置哪种COLLATE以使用所有可能的语言?

时间:2019-01-04 17:53:58

标签: mysql sql database collation

我有一个名为username的列,我希望用户能够以日语,罗马语,阿拉伯语,韩语以及所有可能的字符(包括特殊字符[https://en.wiktionary.org/wiki/Index:All_languages])插入文本, COLLATE我应该在数据库和表上进行设置吗?

我正在使用utf_general_ci,我是新手,所以我不知道这是否是满足我需求的最佳COLLATE。我需要选择正确的COLLATE以避免sql错误,因为我不会使用preg_replace或函数来替换特殊字符,因此我只会使用prepared statement避免SLQ注入并通过数据库。

2 个答案:

答案 0 :(得分:2)

  • 首选(MySQL 8.0):utf8mb4_0900_ai_ci
  • 第二选择(从5.6开始):utf8mb4_unicode_520_ci
  • 第三种选择(5.5+):utf8mb4_unicode_ci
  • 在5.5之前,您无法处理所有中文,也无法处理表情符号:utf8_unicode_ci

数字表示Unicode标准9.0、5.20和(无数字)4.0。

没有排序规则适合同时对所有语言进行排序。西班牙语,德语,土耳其语等具有不兼容的怪癖。上面的归类是可用的“最佳”通用归类。

utf8mb4处理所有尚未由Unicode指定的字符(包括切诺基,克林贡语,楔形文字,拜占庭语等)

如果重点是葡萄牙语:

请参见https://pt.stackoverflow.com/MySQL collation for Portugese

研究this for 8.0this for pre 8.0,以查看哪种utf8 / utf8mb4归类最接近“正确地”分类葡萄牙语。也许utf8mb4_danish_ciutf8mb4_de_pb_0900_ai_ci是最好的。

(否则,请使用上面列出的“选择”。)

答案 1 :(得分:1)

如果使用MySQL 5.5.3或更高版本,我建议使用UTF-8字符编码utf8mb4_unicode_ci 。 AFAIK支持大多数(如果不是全部)语言,并实现Unicode标准进行排序和比较。作为第二选择,请看一下utf8mb4_general_ci,它可能更快但也不太准确。

有关更多详情,请参见this excellent SO post,或查看official MySQL doc

在5.5.3以下,utf8_unicode_ci 是您的朋友。