公司的部分项目使用了latin1的字符编码,为了方便搜索,包含中文的字段设置了binary参数。但我发现用phpmyadmin备份的数据导入后竟然是乱码。上网查找了一番后发现是phpmyadmin-2.10*(具体是哪个版本有了变化我没有去测试)及之前版本,在导出数据时有“二进制区域使用十六进制显示”并且是默认选中的。结果导出的数据文件中,设置了binary参数的字段显示为“0x**”状,但是再用phpmyadmin导加数据库这些字段却显示乱码,即使用命令行方式,正确设置连接编码,也是乱码。但是如果不选择“二进制区域使用十六进制显示”导出的数据文件中文是乱码,但是用phpmyadmin导入后,数据是正常的(要用命令行方式并指定字符编码)。
该问题只存在于phpmyadmin-2.10*及之前版本,后续版本,将该项变更为“Use hexadecimal for BLOB”即只对blog类型的数据进行二进制转换。
分析phpmyadmin源码后发现是程序将带binary参数的字段进行了二进制编码,调用了bin2hex函数。但是因为phpmyadmin在导出时使用的连接编码不是字段的编码,即导出的数据成了“乱码”再对这些乱码的数据进行二进制编码,最后就产生了对我们没有意义的乱码数据。我曾尝试用多种方法对这此数据进行处理,最终发现都无法得到原始的正常中文。
但是我最后发现将其用pack函数(pack('H*', 去掉0x后的数据)处理后的数据和不选择“二进制区域使用十六进制显示”时导出的数据是相同的。这样问题似乎就可以间接的解决了。
本人写了一个小程序用于处理选择了“二进制区域使用十六进制显示”导出的数据。将“0x**”转换成phpmyadmin能接受的“乱码”数据,再用phpmyadmin导入。进命令行查询,出现了正常的中文。
程序地址:
http://aaliwen.awardspace.com/converthexbinary.php
http://aaliwen.freehostia.com/converthexbinary.php
注意:本从提供了两种在线转换程序,最后一种您可以自己组建PHP运行环境来处理您本地的文件。虽经本人测试正常,但也请您先行测试后再使用生成的数据。生成的数据请用原版(未使用本人制作的修正补丁)phpmyadmin进行导入。
如有问题,请及时与我联系:aaliwen@126.com。
phpmyadmin备份的数据导入后乱码
最新推荐文章于 2022-04-20 19:57:29 发布