Shell 脚本通过 load data 导入MySQL数据库乱码 解决方法

整体思路

1、数据库所有编码方式转为utf8

2、导入的文件编码转为utf8 注意文件内容也是utf8格式,别只是文件编码换了utf8,文件通过utf8格式打开还是乱码的,这样的话你导入到数据库也是乱码的

3、系统环境编码设置为utf8


过程:

一、设置数据库编码

1、设置数据库服务器编码

我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来

我们可以通过命令查看数据库当前编码:  

      mysql> SHOW VARIABLES LIKE 'character%';

 Shell 脚本通过 load data 导入MySQL数据库乱码 解决方法_第1张图片

如果跟上表不一致的,通过以下语句设置编码

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数据库,设计表,改变表的编码

 Shell 脚本通过 load data 导入MySQL数据库乱码 解决方法_第2张图片

以及字段的编码

 Shell 脚本通过 load data 导入MySQL数据库乱码 解决方法_第3张图片

3、设置navicat 连接属性

设置连接属性,编码为utf-8,并且勾选 使用MySQL字符集

 Shell 脚本通过 load data 导入MySQL数据库乱码 解决方法_第4张图片

通过以上设置,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)写数据库执行函数

 Shell 脚本通过 load data 导入MySQL数据库乱码 解决方法_第5张图片

 exec_mysql_sql(){
str_sql="$1"
mysql -u${MYSQL_USER} -p${MYSQL_PWD} -P${MYSQL_PORT} -h${MYSQL_HOST} -D${MYSQL_NAME} <

2)设置linux系统环境变量为utf8,防止因为系统本身的编码不是utf8导致导入数据库乱码,下面的编码设置放在脚本里执行,本次有效,不影响系统整体环境。

 Shell 脚本通过 load data 导入MySQL数据库乱码 解决方法_第6张图片

#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}"

执行完脚本后,数据最后终于成功导入数据库,也不会乱码了。

 


你可能感兴趣的:(mysql,linux,shell,mysql,load,data,linux,shell)