问题摘要:在UTF8和Latin1的表ISO-8859-1的数据转换为UTF-8
虽然试图用mysql数据库网站latin1和UTF8转换,一些特殊字符无法正确显示,尽管确保字符集都是utf8系统。
问题详细信息:
这是一个常见的问题。但我似乎增加了复杂性。
几年前,一个不知情的开发者(我),把一个网站与MySQL放在一起。一些表格使用latin1_swedish_ci和utf8_general_ci进行设置。所有的输入/显示都是通过带有iso-8859-1字符集的页面完成的。
现在,我的任务是将所有这些数据转换为utf-8,并最终统一编码。但是,我在两种情况下都遇到过许多特殊字符(例如:ü)。这些字符似乎无法在UTF-8页面上正确显示。它们显示为Ins.而不是当在mysql查询浏览器中查看utf8表中的数据时,正确输入的utf8'd'u'显示为某些特殊字符,而拉丁文'u'显示不正确,因为它应该显示在页面上。但事实并非如此。
我已经尝试了一些事情:
- Percona的脚本:https://github.com/rlowe/mysql_convert_charset
- 山坳转换为二进制,然后以UTF8
- UTF8转换表,拉丁,然后重复上面的过程
似乎没有什么治疗数据。
转储整个数据库和重要的是不是一个真正可行的选择,因为它现在是一个巨大的数据库,停机时间受到限制。
UPDATE(10月22日 - 2013年)
我已经采取@deceze建议和审查我的所有内容编码领域的每http://kunststube.net/frontback/。我确实发现了一些我仍然在latin1中传递/编码数据的地方。所以,我现在已经将它全部更改为UTF-8。但是,数据在特定字段中仍然显示不正确。在一个utf8表格中(没有列有隐式编码),field1在latin1中。我可以通过运行显示正确的文字下面证实了这一点:从我的表
选择转换(CAST(转换(FIELD1使用LATIN1)作为二进制使用 UTF8))WHERE ID = 1
这会将Hahnemühle转换为Hahnemühle。
在字段2中,数据显示为不同的(未知)编码。上面的查询在field2上使用时,将Hahnem�hle转换为Hahnem hle。我已经通过http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html取代latin1的所有字符,但没有一个似乎正确地将数据吐出。
这些“问题”到底是什么?这些字符是否正确存储在各自的列中?当他们在一个体面的管理界面上查看他们时,他们是否应该看起来像他们应该看的,还是他们已经乱码?除非您尝试在Latin1列中存储非Latin1字符,否则到目前为止设置这些列的设置并不重要。 latin1列不能存储多于由Latin-1定义的256个字符,只是在日常使用中无关紧要。如果您使用正确的连接编码插入数据,则应该没有问题。 – deceze
@deceze我添加了这个问题(对不起)。这些字符在utf-8页面上没有正确显示。相反,我在Google Chrome中收到一个钻石问号。在mysql查询浏览器中查看utf8表中的数据时,正确输入的utf8'd'u'将显示为一些特殊字符,而不正确的latin1'u'则显示为它应该出现在页面上。但事实并非如此。 – David
您是否更新了连接编码,因此来自数据库的数据实际上是UTF-8编码?或者你仍然在检索Latin-1中的数据? – deceze