【问题标题】:Is MySQL's collation solely used for sorting?MySQL的排序规则是否仅用于排序?
【发布时间】:2013-06-12 16:51:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 排序规则 仅用于执行比较(例如,在对数据进行排序时) - 但某些排序规则只能与特定的 编码 一起使用,因此可以通过更改您还隐式更改编码的排序规则。

标签: php mysql encoding character-encoding collation


【解决方案1】:

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

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

正如 cmets 中所指出的,对事物的工作原理进行了一些解释。

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 你的意思是像$mysqli->set_charset("utf8");
  • 当我将该行添加到我的连接并将排序规则切换回 latin1_swedish_ci 我得到一个不正确的字符串值错误
  • 这并不奇怪,因为您的数据库中已经存在乱码文本。我将调整我的答案以进一步解释这一点。
猜你喜欢
  • 2012-01-19
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多