问题摘要:
在尝试将具有mysql数据库的站点从latin1转换为utf8时,尽管确保字符集在系统范围内都是utf8,但某些特殊字符无法正确显示。
问题详细信息:
这是一个常见问题。但我似乎有一个额外的复杂性。
多年前,一个不知名的开发人员(我),将一个网站与MySQL放在一起。一些表使用latin1_swedish_ci和utf8_general_ci设置。所有输入/显示都是通过iso-8859-1 charset页面完成的。
现在,我的任务是将所有这些数据转换为utf-8,从而最终使编码保持统一。但是,我在两个实例中都遇到了许多特殊字符的问题(即:ü)。这些字符似乎无法在UTF-8页面上正确显示。它们显示为 。相反当在mysql查询浏览器中查看utf8表中的数据时,正确输入的utf8'd'u'显示为一些特殊字符,而错误的latin1'u'显示为应显示在页面上。但事实并非如此。
我尝试了很多东西:
似乎没有什么能够治愈数据。
倾倒整个数据库并且重要的并不是一个可行的选择,因为它现在是一个巨大的数据库,并且停机时间受到限制。
更新(2013年10月22日)
我已根据http://kunststube.net/frontback/采用@deceze建议并审核了我的所有内容编码区域。我确实找到了一些我仍然在latin1中传递/编码数据的地方。所以,我现在把它全部改为UTF-8。但是,数据仍然在特定字段中显示不正确。在utf8中的表中(没有列具有隐式编码),field1在latin1中。我可以通过运行以下正确显示文本的内容来确认:
选择转换(使用转换(使用latin1转换(field1,使用latin1)) utf8)来自我的表WHERE 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,但似乎没有人正确地吐出数据。
答案 0 :(得分: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
答案 1 :(得分:3)
在MySQL中将列设置为latin1
,将其他列设置为utf8
完全没问题。这里没有问题需要解决。此charset参数仅影响数据在内部的存储方式。这当然也意味着您无法在latin1
列中存储“汉字”。但假设你只是在那里存储“Latin-1字符”,那很好。
MySQL通常称为连接编码。它告诉MySQL你从PHP(或其他地方)发送给它的编码文本,以及从MySQL检索数据时你想要的编码。列charset,“输入连接编码”和“输出连接编码”都可以是不同的东西,MySQL将根据需要相应地转换编码。
因此,假设您到目前为止使用了正确的连接编码并且数据已正确存储在数据库中,并且您没有尝试在Latin-1列中存储非Latin-1字符,那么您需要做的就是将列charsets更新为UTF-8:
ALTER TABLE table MODIFY column TEXT [...] CHARACTER SET utf8;
答案 2 :(得分:2)
您可以通过在字符串中显示utf8_encode之前删除“字形”字符( )。