Mysql 对于所有世界语言,我必须使用utf8\u general\u ci或utf8\u unicode\u ci或任何其他排序规则?

Mysql 对于所有世界语言,我必须使用utf8\u general\u ci或utf8\u unicode\u ci或任何其他排序规则?,mysql,unicode,utf-8,collation,Mysql,Unicode,Utf 8,Collation,我们开发了android应用程序。该应用程序接受来自用户的文本并上传到服务器(mysql)。然后,其他用户将阅读此文本 在测试过程中,我发现“印地语”(印地语)作为“印地语”插入到列中。然后在SO搜索之后,我将排序规则更改为utf8\u general\u ci 我不熟悉整理。我想让用户输入世界上任何语言的文本,其他人也可以访问。我该怎么办。准确性是必须的 但我看到一条评论说,“你永远不应该使用utf8_general_ci。它根本不起作用。这是回到50年前ASCII错误的旧时代。如果没有UCD

我们开发了android应用程序。该应用程序接受来自用户的文本并上传到服务器(mysql)。然后,其他用户将阅读此文本

在测试过程中,我发现“印地语”(印地语)作为“印地语”插入到列中。然后在SO搜索之后,我将排序规则更改为utf8\u general\u ci

我不熟悉整理。我想让用户输入世界上任何语言的文本,其他人也可以访问。我该怎么办。准确性是必须的


但我看到一条评论说,“你永远不应该使用utf8_general_ci。它根本不起作用。这是回到50年前ASCII错误的旧时代。如果没有UCD的折叠式映射,Unicode不区分大小写的匹配是不可能完成的。例如,∑∑∑∑∑σ∑οφς”有三个不同的符号;或者“TSCHü”的小写字母ẞ” 是“tschüβ”,但“tschüβ”的大写字母是“tschÜSS”。你可以是对的,也可以是快的。因此你必须使用utf8_unicode_ci,因为如果你不关心正确性,那么让它无限快就很简单了。”

你的问题标题是关于排序规则的,但在正文中你说:

我想让用户输入世界上任何语言的文本,其他人也可以访问

所以,我假设这就是您特别想要的。为了澄清,排序规则会影响MySQL如何比较字符串,但这并不是最终打开存储unicode字符的可能性的原因

对于存储,您需要确保正确定义了字符集。MySQL允许您在列级别指定字符集和排序规则值,但也允许您在表和数据库级别指定默认值。通常,我建议在数据库和表级别设置默认值,并在定义时让MySQL处理其余内容列。请注意,如果已经存在具有不同字符集的列,则您需要研究更改它。根据您与MySQL通信所使用的内容,您可能还需要指定用于连接的字符编码

请注意,
utf8mb4
对于所使用的字符集是绝对必需的,不要仅使用
utf8
。您将无法使用UTF-8存储消耗4字节的unicode字符,例如表情符号


至于要使用的排序规则,我没有一个真正的建议,因为它有点取决于你的目标,速度或准确性。在其他答案中,有相当多的信息涵盖了这个主题。

没有一个简单的排序规则适用于每种语言环境。没错。如果这是一个新的应用程序,请使用
utf8mb4
字符集。对于许多语言,
utf8mb4_unicode_ci
排序规则将工作得相当好。但是,这里列出的排序规则集中有许多例外情况。这是因为排序规则在某些语言中是矛盾的。例如,西班牙语将N和ñ排序为不同的字母,而其他罗曼语则是ges将它们整理为相同的。