整体思路
1、数据库所有编码方式转为utf8
2、导入的文件编码转为utf8 (注意文件内容也是utf8格式,别只是文件编码换了utf8,文件通过utf8格式打开还是乱码的,这样的话你导入到数据库也是乱码的)
3、系统环境编码设置为utf8
过程:
一、设置数据库编码
1、设置数据库服务器编码
我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来
我们可以通过命令查看数据库当前编码:
mysql> SHOW VARIABLES LIKE 'character%';
如果跟上表不一致的,通过以下语句设置编码
SET character_set_client = utf8; SET character_set_connection = utf8; SET character_set_database = utf8; SET character_set_results = utf8; SET character_set_server = utf8; SET character_set_system = utf8;
通过以上配置,数据库的基本配置编码都改为了utf8,但是这个只能在当前状态下生效,重启服务器后,会变回原来配置文件配置的编码,所以如果要永久生效,必须修改my.ini 配置文件。
2、设置表编码和字段编码
通过navicat 连接MySQL数据库,设计表,改变表的编码
以及字段的编码
3、设置navicat 连接属性
设置连接属性,编码为utf-8,并且勾选 使用MySQL字符集
通过以上设置,MySQL数据库服务器和客户端都已经设置为utf8环境了。
二、文件处理
我处理文件的环境是centos7,源文件的格式是ISO-8859-1
通过file -i 文件名
可以查看文件编码格式。
Linux下可以通过iconv 转码 ,于是我想当然的认为通过
iconv -f ISO-8859-1 -t UTF-8 2018061523.txt -o new.txt
这样就能将上面的文件转为utf8,结果打开生成的文件还是乱码。
就这个东西查了很多东西,捣鼓了好久。然后我
iconv -f GBK -t UTF-8 2018061523.txt -o new.txt
就好了...
我。。。。。。。
这个坑,留个教训吧。
到这里文件也转码好了。
三、批量导入脚本
接下来就是写脚本批量导入数据库了。
1)写数据库执行函数
exec_mysql_sql(){
str_sql="$1"
mysql -u${MYSQL_USER} -p${MYSQL_PWD} -P${MYSQL_PORT} -h${MYSQL_HOST} -D${MYSQL_NAME} <<!
set names utf8;
${str_sql}
commit;
!
}
2)设置linux系统环境变量为utf8,防止因为系统本身的编码不是utf8导致导入数据库乱码,下面的编码设置放在脚本里执行,本次有效,不影响系统整体环境。
#locale
LANG=zh_CN.utf8
LC_CTYPE="zh_CN.utf8"
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=
3)导入数据库语句
_LOAD_SQL="load data local infile 'new.txt' into table table character set utf8 fields terminated by ',';"
exec_mysql_sql "${_LOAD_SQL}"
执行完脚本后,数据最后终于成功导入数据库,也不会乱码了。