需求其实很简单

开发写了一个程序,部署在A服务器上,mysql字符集是UTF-8(程序库和表,数据都是UTF-8).里面有一张表需要从B服务器获得。程序没有处理。需要手动导出导入。B服务器mysql 默认字符集为latin1(程序库和表,以及数据都是latin1)

#/usr/local/mysql/bin/mysqldump -uroot -p --default-character-set=latin1 Adatabase tblItems > Adatabase_tblItems.sql

# sed -i -e 's/latin1/utf8/g' Adatabase_tblItems.sql

# mysql -u root -p gmp

导入进去后是乱码。

后来把表结构和数据就拆分后再导入还是一样。

为了排查原因做了以下操作。

将两台服务器系统的字符集修改一样。

将SecureCRT字符集修改一样。

然后使用A 服务器使用set names utf8再source 还是不行

然后使用load data infile方式还是不行。

怀疑导入方式那里有问题,做了把正确的数据导出后再导入正常。说明导入数据正确

在B服务器查看load数据文件

#file tblItems
tblItems_utf8: ISO-8859 text

# file tblItems   
tblItems_bak: Non-ISO extended-ASCII text

判断为传输过程编码格式改变

从sftp传输改为http传输后还是一样。

iconv转换文件无法转换。

后来用enca后解决。

问题的关键处在数据的编码方式。

和系统字符集。mysql客户端的字符集关系不大。

总结:

1、如果没有特殊的限制尽量让系统字符集一样。

2、如果没有特殊情况尽量让SecureCRT字符集修改一样

3、关于中文load前 可以查看一下文件的编码以及内容