我应该设置什么 COLLATE 来使用所有可能的语言?

What COLLATE should i set to use all kind of possible languages?

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

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

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

this excellent SO post for (many) more details, or check out the official MySQL doc

5.5.3以下,utf8_unicode_ci 是你的朋友

  • 首选(MySQL8.0):utf8mb4_0900_ai_ci
  • 第二选择(截至 5.6):utf8mb4_unicode_520_ci
  • 第三选择(5.5+):utf8mb4_unicode_ci
  • 5.5之前,你不能处理所有的中文,也不能处理Emoji:utf8_unicode_ci

数字指的是 Unicode 标准 9.0、5.20 和(无数字)4.0。

没有排序规则适合同时对所有 种语言进行排序。西班牙语、德语、土耳其语等都有不兼容的怪癖。上面的归类是 'best' 可用的通用归类。

utf8mb4 处理 Unicode 指定的所有字符(包括 Cherokee、Klingon、Cuneiform、Byzantine 等)

如果葡萄牙语是重点:

参见https://pt.whosebug.com/ and MySQL collation for Portugese

研究 this for 8.0 or this for pre 8.0 以查看哪种 utf8/utf8mb4 排序规则最接近葡萄牙语排序 'correctly'。也许 utf8mb4_danish_ciutf8mb4_de_pb_0900_ai_ci 是最好的。

(否则使用上面列出的 'choices'。)