MySQL排序规则:latin1_swedish_ci vs utf8_general_ci

20
在 MySQL 创建表时,Collation 应该设置为什么?
应该选择 latin1_swedish_ci 还是 utf8_general_ci
Collation 是什么意思?
我一直在使用 latin1_swedish_ci,这会引起问题吗?

1
关于校对规则的问题:https://dev59.com/uHA75IYBdhLWcg3wYX9Q - Pekka
可能是Differences between utf8 and latin1的重复问题。 - Pekka
1
@Pekka:这个问题是关于排序规则而不是编码的,所以它不是第二个链接中的重复问题。;) - Crozin
4个回答

6
无论你做什么,不要尝试在mysql中使用默认的swedish_ci与utf8(而不是latin)排序规则,否则你会遇到错误。排序规则必须与正确的字符集配对才能正常工作。由于字符集和排序规则不匹配,这个SQL将失败:
CREATE  TABLE IF NOT EXISTS `db`.`events_user_preference` (
  `user_id` INT(10) UNSIGNED NOT NULL ,
  `email` VARCHAR(40) NULL DEFAULT NULL ,
  PRIMARY KEY (`user_id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = latin1_swedish_ci

@Blaisorblade指出,解决这个问题的方法是使用与瑞典排序规则相对应的字符集:

DEFAULT CHARACTER SET = utf8_swedish_ci

Yii php框架的cal(日历)模块的SQL代码中有类似于上述错误的代码。希望他们现在已经修复了。


2
以上代码中的错误是因为您将UTF8字符集与latin1_*排序规则相结合。应该使用utf8_swedish_ci代替(http://dev.mysql.com/doc/refman/5.1/en/charset-unicode-sets.html)。因此,您的答案应该只是说明排序规则是特定于字符集的,不能将一个字符集的排序规则与另一个字符集相结合。 - Blaisorblade
是的,那是更简洁的表达方式,我只是想回答OP的问题并防止他们犯下代码中指出的错误。我也应该提供可行的代码。我会加上你的代码。 - hobs

5
您可以在MySQL 5.5这里阅读有关字符集和排序规则的信息:
字符集和排序规则概述
MySQL中的字符集和排序规则

排序规则支持是为了支持世界上众多语言的书写。例如,在我的语言(丹麦语)中,我们有一个特殊字符“æ”。它的发音像瑞典语、德语、匈牙利语等的“ä”。该字符也出现在从这些语言引入的丹麦语单词中。由于排序规则的支持,我们可以同时正确打印它们,并按相同方式排序(ORDER BY…),使它们相同。如果没有排序规则的支持,这是不可能的。

瑞典语排序规则是拉丁字符集的MySQL默认设置。它适用于英语。英语很容易-它适用于所有内容,因为它没有特殊字符、重音等。但是,如果您经常使用另一种语言(例如西班牙语),则可以将排序规则更改为西班牙语排序规则,以便根据西班牙语规则对西班牙语字符串进行正确排序。

德语排序规则的一个非常特殊的例子。它是为了允许像德国电话簿那样排序而创建的。德国电话簿不遵循德语的一般规则!

如果您愿意,可以创建自己的排序规则。排序规则可以编译或文本格式。


0
在Wamp Server 2.5中,您可以通过进入PHPAdmin并选择需要更改的数据库来更改排序规则。这将给您另一组选项卡。选择名为"Operations"的选项卡。在该选项卡中将出现一个名为"collation"的部分,请从下拉菜单中选择所需的选项,然后选择"go"即可完成更改。

-4

2
这与MySQL无关。 - Lucas Caton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接