MySQL的整理是否仅用于排序?

时间:2013-06-16 16:52:34

标签: php mysql encoding character-encoding collation

根据官方MySQL手册,使用的排序规则定义了按字母顺序排序时的记录顺序:

http://dev.mysql.com/doc/refman/5.0/en/charset-general.html

但是:我有一个PHP脚本(UTF-8),我在MySQL数据库中保存了一些外来字符,它保存得很奇怪(第一行)。这是我选择的整理是 latin1_swedish_ci 的时候。当我将排序规则更改为 utf8_unicode_ci 时,一切都很好(第二行)。

upper row data saved with collation latin1_swedish_ci, lower row shows results after saving with utf8_unicode_ci

保存此数据时,除了排序规则外,所有内容完全相同。 那么"整理如何仅用于排序记录"?

有人可以为我澄清这个:-)提前谢谢!

1 个答案:

答案 0 :(得分:1)

看来您的连接的字符集设置不正确,因此从编程语言字符集到数据库的转换不正确。

你应该在连接中设置charset,然后两者都可以工作。

在评论中指出了一些关于事情如何运作的解释。

如果未在连接中设置字符集,则服务器会假定它与数据库的并置相同。当数据以另一种编码方式接收时,数据仍被写入。只是错误或其他字符,而不是脚本中数据的编码。

只要没有任何变化,脚本就会获得与其编写的数据相同的数据,并且一切看起来都很好。

但是,当此时更改连接编码或数据库编码时,已存储的数据将转换为新编码。这里的问题是源数据不在转换时可以考虑的编码中。

所有编码都使用相同的位共享ascii集,这就是为什么ascii charactes不会搞砸的原因。只有特殊的字符。

所以你必须设置你的连接编码,以免产生你已经存在的混乱。

现在您可以对已有的数据做些什么?

您可以使用mysqldump转储数据库并使用--skip-set-charset选项。然后你得到一个纯文本文件。在此平面文本文件中,将实际数据库字符集的所有出现替换为数据实际存在的数据(当您编写数据时脚本中存在的那个)。

然后保存文件并确保您的编辑器不进行任何转换(我建议使用vim)。

然后导入该文件,您将获得一个包含正确编码数据的数据库。那么你可以根据自己的喜好改变编码,只要你的连接字符集得到设置,你就可以从现在开始就好了。

还要确保mysql服务器安装了charsets,但它应该已经安装了charsets。

这只是我的方法,我已经清理了很多乱糟糟的装置。其中大部分在他们的项目中都有乱码(切换服务器,更新或恢复备份......)。 结果没有设置连接字符集是经常被遗忘的东西。