0

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

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

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

使用排序规则 latin1_swedish_ci 保存的上排数据,下排显示使用 utf8_unicode_ci 保存后的结果

保存此数据时,除了排序规则外,一切都完全相同。那么“排序规则仅用于排序记录”怎么样?

有人如何为我澄清这一点:-) 提前致谢!

4

1 回答 1

1

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

您应该在连接中设置字符集,然后两者都可以正常工作。

正如评论中所指出的,对事情的运作方式进行了一些解释。

当您没有在连接中设置字符集时,服务器假定它与数据库的搭配相同。当以另一种编码接收数据时,仍然会写入数据。只是在脚本数据的编码中使用了错误或其他字符。

只要没有任何变化,脚本就会返回与写入相同的数据,并且一切似乎都很好。

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

所有编码都使用相同的位共享 ascii 集,这就是 ascii 字符不会弄乱的原因。只有特殊字符才会这样做。

所以你必须设置你的连接编码,以免产生你已经处于的混乱状态。

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

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

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

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

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

这只是我的方法,我已经清理了很多这样的混乱安装。其中大多数在某些时候在他们的项目中出现了乱码(在切换服务器、更新或恢复备份之后......)。事实证明,不设置连接字符集是经常被遗忘的东西。

于 2013-06-16T16:57:13.643 回答