MySQL如何修复已经编码损坏的数据


方法一 Dump & Reload

这个方法比较笨,但也比较好操作和理解。简单的说分为以下三步:

  • 通过错进错出的方法,导出到文件
  • 用正确的字符集修改新表
  • 将之前导出的文件导回到新表中

还是用上面那个例子举例,我们用UTF-8将数据“错进”到latin1编码的表中。现在需要将表编码修改为UTF-8可以使用以下命令

shell> mysqldump -u root -p -t—skip-set-charset—default-character-set=utf8 test charsettestlatin1 > data.sql

#确保导出的文件用文本编辑器在UTF-8编码下查看没有乱码

shell> mysql -uroot -p -e ‘create table charset_test_latin1 (id int primary key auto_increment, char_col varchar(50)) charset = utf8’ test

shell> mysql -uroot -p —default-character-set=utf8 test < data.sql

方法二 Convert to Binary & Convert Back

这种方法比较取巧,用的是将二进制数据作为中间数据的做法来实现的。由于,MySQL再将有编码意义的数据流,转换为无编码意义的二进制数据的时候并不做实际的数据转换。而从二进制数据准换为带编码的数据时,又会用目标编码做一次编码转换校验。通过这两个特性就相当于在MySQL内部模拟了一次“错出”,将乱码“拨乱反正”了。

还是用上面那个例子举例,我们用UTF-8将数据“错进”到latin1编码的表中。现在需要将表编码修改为UTF-8可以使用以下命令

mysql> ALTER TABLE charset_test_latin1 MODIFY COLUMN char_col VARBINARY(50);

mysql> ALTER TABLE charset_test_latin1 MODIFY COLUMN char_col varchar(50) character set utf8;

From: http://cenalulu.github.io/mysql/mysql-mojibake/

阅读全文