MySQL 排序规则:latin1_swedish_ci 与 utf8_general_ci

Posted

技术标签:

【中文标题】MySQL 排序规则:latin1_swedish_ci 与 utf8_general_ci【英文标题】:MySQL Collation: latin1_swedish_ci Vs utf8_general_ci 【发布时间】:2011-06-13 18:15:45 【问题描述】:

mysql 中创建表时我应该为 Collat​​ion 设置什么:

latin1_swedish_ciutf8_general_ci

到底什么是排序规则?

我一直在用latin1_swedish_ci,会不会有什么问题?

【问题讨论】:

重新排序规则是:***.com/questions/3324900 Differences between utf8 and latin1的可能重复 I don't understand Collation? (Mysql, RDBMS, Character sets)的可能重复 @Pekka:问题是关于排序规则而不是编码,所以它不是第二个链接中问题的重复。 ;) 【参考方案1】:

无论你做什么,都不要尝试在 mysql 中使用带有 utf8(而不是 latin)的默认 swedish_ci 排序规则,否则会出错。排序规则必须与正确的字符集配对才能工作。由于 charset 和 collat​​ion 不匹配,此 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 与上述错误代码类似。希望他们现在已经修好了。

【讨论】:

上述代码中的错误是因为您将 UTF8 字符集与 latin1_* 排序规则结合在一起。它应该改用utf8_swedish_ci (dev.mysql.com/doc/refman/5.1/en/charset-unicode-sets.html)。因此,您的回答应该只是说排序规则是特定于字符集的,并且一个字符集的排序规则不能与另一个字符集组合。 是的,这是一种更简洁的说法,我只是想回答 OP 的问题并防止他们犯代码中说明的错误。我还应该提供有效的代码。将添加您的。【参考方案2】:

您可以在此处阅读有关 MySQL 5.5 的字符集和排序规则:Character Sets and Collations in GeneralCharacter Sets and Collations in MySQL

排序规则支持对于支持世界上所有许多书面语言是必要的。例如,在我的语言(丹麦语)中,我们有一个特殊字符“æ”。这听起来像瑞典语、德语、匈牙利语(以及更多) 'ä' 。该字符也出现在丹麦语中,并带有从其中一种语言中导入的单词。由于排序规则的支持,我们可以正确打印并且相同的排序(ORDER BY ...)是相同的。如果没有排序规则支持,这是不可能的。

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

一个非常特殊的排序规则示例是德语排序规则之一。它的创建是为了允许像在德国电话簿中一样进行排序。德国电话簿不遵循德语的一般规则!

您可以根据需要创建自己的排序规则。排序规则可以编译或文本格式。

【讨论】:

【参考方案3】:

在 Wamp Server 2.5 中,您可以通过进入 PHPAdmin,选择您需要更改的数据库来更改排序规则。这将为您提供另一组选项卡。选择名为“操作”的选项卡。在该选项卡中将有一个名为 collat​​ion 的部分,在下拉列表中选择您想要的部分,然后选择 go。

【讨论】:

【参考方案4】:

试试这些:

<?php
echo htmlspecialchars($string);
echo htmlentities($string);
?>

您可以从http://php.net/manual/en/function.htmlspecialchars.php 看到更多信息。 :D

为我工作!没有更多的钻石:)

【讨论】:

这与 MySQL 无关。

以上是关于MySQL 排序规则:latin1_swedish_ci 与 utf8_general_ci的主要内容,如果未能解决你的问题,请参考以下文章

当所有排序规则都已经标准化时,Mysql 非法混合排序规则

Mysql 排序规则选择

发现 MySQL 列的排序规则

创建自定义 MySQL 排序规则

MySQL - 最佳排序规则?

MySQL建立数据库时字符集和排序规则的选择