2013-10-21 46 views
3

问题摘要:在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'显示不正确,因为它应该显示在页面上。但事实并非如此。

我已经尝试了一些事情:

  1. Percona的脚本:https://github.com/rlowe/mysql_convert_charset
  2. 山坳转换为二进制,然后以UTF8
  3. 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的所有字符,但没有一个似乎正确地将数据吐出。

+0

这些“问题”到底是什么?这些字符是否正确存储在各自的列中?当他们在一个体面的管理界面上查看他们时,他们是否应该看起来像他们应该看的,还是他们已经乱码?除非您尝试在Latin1列中存储非Latin1字符,否则到目前为止设置这些列的设置并不重要。 latin1列不能存储多于由Latin-1定义的256个字符,只是在日常使用中无关紧要。如果您使用正确的连接编码插入数据,则应该没有问题。 – deceze

+0

@deceze我添加了这个问题(对不起)。这些字符在utf-8页面上没有正确显示。相反,我在Google Chrome中收到一个钻石问号。在mysql查询浏览器中查看utf8表中的数据时,正确输入的utf8'd'u'将显示为一些特殊字符,而不正确的latin1'u'则显示为它应该出现在页面上。但事实并非如此。 – David

+0

您是否更新了连接编码,因此来自数据库的数据实际上是UTF-8编码?或者你仍然在检索Latin-1中的数据? – deceze

回答

3

设置一列到latin1和其他到utf8在MySQL中是完全正确的。这里没有问题需要解决。这个字符集参数仅影响数据在内部存储的方式。这当然也意味着你不能在latin1列中存储例如“汉字”。但假设你只是在那里存储“拉丁-1字符”,那很好。

MySQL有一些通常被称为连接编码。它告诉MySQL你从PHP(或其他地方)发送给它的文本是什么编码,以及从MySQL检索数据时你想要返回哪种编码。列charset,“输入连接编码”和“输出连接编码”都可以是不同的东西,MySQL会根据需要随时转换编码。

因此,假设您到目前为止使用了正确的连接编码,并且数据已正确存储在您的数据库中,并且您尚未尝试在Latin-1列中存储非拉丁文-1字符,那么您只需执行更新您的列字符集为UTF-8是:

ALTER TABLE table MODIFY column TEXT [...] CHARACTER SET utf8; 
4

你可以尝试的mysqldump从ISO-8859-1转换为UTF-8:

mysqldump --user=username --password=password --default-character-set=latin1 --skip-set-charset dbname > dump.sql 
chgrep latin1 utf8 dump.sql (or when you prefer sed -i "" 's/latin1/utf8/g' dump.sql) 
mysql --user=username --password=password --execute="DROP DATABASE dbname; CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;" 
mysql --user=username --password=password --default-character-set=utf8 dbname < dump.sql 
+0

为sed tidbit +1,另一种chgrep方式为奖励。 – stefgosselin

1

您可以摆脱“字形“字符( )通过将UTF8_encode应用于字符串,然后将其显示在页面中。