因为某网站页面动态部分乱码,检查发现数据库内存储的汉字全部变成乱码了。
网站和数据库的配置都是utf8的,检查发现数据库varchar内的存的字符串变为latin1编码了,应该是网站代码错误,回写内容时把汉字都写乱了。
现在的情况是字段编码类型和库默认编码都是utf8,但汉字的二进制格式是latin1存储,最要紧的是尽快恢复数据库的正确编码。
登录Mysql Shell,用charset latin1;select ..查看,汉字正常显示出来了,有望恢复。
用MySQLAdministrator和SQLYog尝试导出,无法指定编码,导出来为按字段编码而默认的utf8乱码的文本文件,我安装的editplus不支持latin1打开,没法转码。
换种方法,登录Mysql Shell,用create temporay table .. select .. convert(.. using utf8),临时表内的varchar字段还是latin1的内容存在utf8字段。更改字段的编码类型,入Linux Shell,按latin1格式mysqldump到表备份,用iconv命令转换,RPWT,我的iconv不起作用,转了还是乱码。 _O_
现在烦恼的是,字段明明是utf8,但是字段的二进制格式偏偏不对,工具都按utf8去读取。
查手册mysqldump虽然有--default-character-set 参数,可惜新版下不起作用,必须附加--compatible=mysql40 参数。
在Linux Shell输入:
mysqldump -u帐号 -p密码 --compatible=mysql40 --default-character-set=latin1 库名 表名 | mysql -u帐号 -p密码 库名 --default-character-set=utf8
成功,汉字终于回来了。