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

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


当前回答

我发现这些整理图表很有用。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排序顺序,因此可以在更多语言中正确排序

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

我发现这些整理图表很有用。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是MySQL中Unicode的默认排序规则,所以如果您想使用utf8_Unicode_ci,那么您必须在很多地方指定它。

例如,所有客户端连接不仅有一个默认字符集(对我来说有意义),而且还有一个默认排序规则(即,对于unicode,排序规则将始终默认为utf8_general_ci)。

很可能,如果您对字段使用utf8_unicode_ci,则需要更新连接到数据库的脚本,以明确提及所需的排序规则,否则当您的连接使用默认排序规则时,使用文本字符串的查询可能会失败。

结果是,当将任何大小的现有系统转换为Unicode/utf8时,由于MySQL处理默认值的方式,您可能会被迫使用utf8_general_ci。

主要区别是排序精度(比较语言中的字符时)和性能。唯一特殊的是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

排序规则影响数据的排序方式以及字符串之间的比较方式。这意味着您应该使用大多数用户期望的排序规则。

charset unicode文档中的示例:

utf8_general_ci也令人满意德语和法语,除了“ß”等于“s”,而不是“ss”。如果您可以接受应用程序,则应使用utf8_general_ci,因为它更快。否则,请使用utf8_unicode_ci,因为它更准确。

所以,这取决于您的预期用户群以及您需要正确排序的程度。对于英语用户群,utf8_general_ci应该足够了,对于其他语言,如瑞典语,已经创建了特殊的排序规则。