问题概述:
在尝试将具有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
- 将列转换为二进制,然后转换为utf8
- 将utf8表转换为latin,然后重复上述过程
似乎没有什么方法可以解决数据问题。
倒出整个数据库并进行重要操作并不是一个可行的选择,因为它现在是一个庞大的数据库,而且停机时间很短。
更新(2013年10月22日)
我采纳了@deceze的建议,并根据http://kunststube.net/frontback/中的所有内容编码区域进行了审查。我确实发现一些仍在使用latin1传递/编码数据的地方。所以,我现在已经全部改成了UTF-8。然而,在一个表中,这个数据仍然不能正确显示。在一个utf8的表中(没有列有隐式编码),field1是在latin1中。我可以通过运行以下命令来确认这一点,从而正确地显示文本:
从我的表中选择convert(cast(convert(field1 using latin1) as binary) using utf8),其中id = 1
这将把Hahnemühle转换为Hahnemühle。
在field2中,数据似乎采用不同的(未知)编码方式。当在field2上使用上述查询时,Hahnem�hle被转换为Hahnem�hle。我已经浏览了http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html上的所有字符集,但没有一个能正确输出数据。
latin1
列只能存储由Latin-1定义的256个字符,除此之外,在日常使用中并不重要。如果您使用正确的连接编码插入数据,则不应存在任何问题。 - decezeutf8
,你应该会得到UTF-8编码的数据,无论它存储在你的列中。在整个链路中,从数据库→PHP→浏览器,数据被转换成了不是UTF-8的东西。根据所提供的信息,无法告诉你具体在哪里出了问题。 - decezebin2hex($string)
值以及应该显示的文本。 - deceze