问题总结:
在尝试将具有 mysql 数据库的站点从 latin1 转换为 utf8 时,尽管确保字符集都是 utf8 系统范围,但某些特殊字符无法正确显示。
问题详情:
这是一个常见的问题。但我似乎有一个额外的复杂性。
多年前,一个健忘的开发人员(我)将一个站点与 MySQL 放在一起。有些表是用 latin1_swedish_ci 和 utf8_general_ci 设置的。所有输入/显示都是通过带有 iso-8859-1 字符集的页面完成的。
现在,我的任务是将所有这些数据转换为 utf-8,从而最终统一编码。但是,我在这两种情况下都遇到了一些特殊字符的问题(即:ü)。这些字符似乎无法在 UTF-8 页面上正确显示。它们显示为�。相反,当在 mysql 查询浏览器中查看 utf8 表中的数据时,正确输入的 utf8'd 'u' 显示为一些特殊字符,而错误的 latin1 'u' 显示为页面上应显示的内容。但事实并非如此。
我尝试了很多事情:
- Percona 脚本:https ://github.com/rlowe/mysql_convert_charset
- 将 col 转换为二进制,然后转换为 utf8
- 将 utf8 表转换为拉丁文,然后重复上述过程
似乎没有什么可以治愈数据。
转储整个数据库和重要数据库并不是一个真正可行的选择,因为它现在是一个巨大的数据库并且停机时间受到限制。
更新(2013 年 10 月 22 日)
我已经接受了@deceze 的建议,并根据http://kunststube.net/frontback/审查了我所有的内容编码区域。我确实找到了一些我仍然在 latin1 中传递/编码数据的地方。所以,我现在已将其全部更改为 UTF-8。但是,数据在特定字段中仍然显示不正确。在 utf8 格式的表中(没有列具有隐式编码),field1 位于 latin1 中。我可以通过运行以下正确显示文本的命令来确认这一点:
从我的表 WHERE id = 1 中选择 convert(cast(convert(field1 using latin1) as binary) using utf8)
这会将 Hahnemühle 转换为 Hahnemühle。
在 field2 中,数据似乎采用不同的(未知)编码。上面的查询在 field2 上使用时会将 Hahnem�hle 转换为 Hahnem�hle。我已经浏览了http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html上的所有字符集,替换了 latin1,但似乎没有一个能正确吐出数据。