我想知道,对于您不能100%确定将要输入的内容的普通网站,MySQL中是否有“最佳”排序选择?我知道所有的编码应该是相同的,比如MySQL、Apache、HTML和PHP中的任何内容。

在过去,我将PHP设置为以“UTF-8”输出,但这与MySQL中的排序规则匹配?我认为它是UTF-8之一,但我以前使用过utf8_unicode_ci、utf8_general_ci和utf8_bin。


当前回答

实际上,您可能希望使用utf8_unicode_ci或utf8_general_ci。

utf8_general_ci通过去掉所有重音符号进行排序,并将其排序为ASCIIutf8_unicode_ci使用unicode排序顺序,因此可以在更多语言中正确排序

然而,如果您只是使用它来存储英文文本,那么它们应该不会不同。

其他回答

我发现这些整理图表很有用。http://collation-charts.org/mysql60/.但我不确定哪个是使用的utf8_general_ci。

例如,这里是utf8_swedish_ci的图表。它显示了它解释为相同的字符。http://collation-charts.org/mysql60/mysql604.utf8_swedish_ci.html

实际上,您可能希望使用utf8_unicode_ci或utf8_general_ci。

utf8_general_ci通过去掉所有重音符号进行排序,并将其排序为ASCIIutf8_unicode_ci使用unicode排序顺序,因此可以在更多语言中正确排序

然而,如果您只是使用它来存储英文文本,那么它们应该不会不同。

主要区别是排序精度(比较语言中的字符时)和性能。唯一特殊的是utf8_bin,它用于比较二进制格式的字符。

utf8_generalci比utf8_unicodeci稍快,但不太准确(用于排序)。特定语言utf8编码(如utf8_swedish_ci)包含额外的语言规则,这些规则使这些语言的排序最准确。大多数时候我使用utf8_unicode_ci(我更喜欢精确性而不是小的性能改进),除非我有充分的理由更喜欢特定的语言。

您可以在MySQL手册上阅读有关特定unicode字符集的更多信息-http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

对于UTF-8文本信息,应该使用utf8_general_ci,因为。。。

utf8_bin:按中每个字符的二进制值字符串utf8_general_ci:比较字符串使用通用语言规则和使用不区分大小写的比较

也就是说,它将使搜索和索引数据更快、更有效、更有用。

本质上,这取决于你如何看待字符串。

由于Guus强调的问题,我总是使用utf8_bin。在我看来,就数据库而言,字符串仍然只是一个字符串。字符串是一组UTF-8字符。一个字符有一个二进制表示,所以为什么它需要知道你使用的语言?通常,人们会为多语言站点的系统构建数据库。这就是使用UTF-8作为字符集的全部意义。我是一个有点纯粹的人,但我认为错误风险大大超过了索引可能带来的微小优势。任何与语言相关的规则都应该在比DBMS高得多的级别上执行。

在我的书中,“价值”在一百万年内永远不应该等于“价值”。

如果我想存储文本字段并进行不区分大小写的搜索,我将使用MYSQL字符串函数和PHP函数,如LOWER()和PHP函数strtolower()。