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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013240609/article/details/80944230

整体思路

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

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

 


展开阅读全文

mysq load data 第一行乱码

10-08

用load data的时候 第一行出现了乱码rn要导入的数据mysql.txt:(txt的编码我已经保存为utf8了)rn223456济南java_boy@126.comrn468872美国java_boy@163.comrn985435云南sinaboy@126.comrn036597非洲java_boy@sina.comrn698743泰安java@vip.comrn456987上海testsqk@nba.comrnrnrn创建语句如下:rn[code=SQL]rnmysql> show create table t_sql \G;rn*************************** 1. row ***************************rn Table: t_sqlrnCreate Table: CREATE TABLE `t_sql` (rn `phone` varchar(6) DEFAULT NULL,rn `addr` varchar(8) DEFAULT NULL,rn `email` varchar(20) DEFAULT NULLrn) ENGINE=InnoDB DEFAULT CHARSET=utf8rn1 row in set (0.00 sec)rn[/code]rnrn导入的语句如下:rn[code=SQL]rnmysql> load data infile 'c:\\mysql.txt'rn -> into table t_sql (@xx)rn -> set phone=SUBSTRING(@xx,1,6),rn -> addr=SUBSTRING(@xx,7,2),rn -> email=SUBSTRING(@xx,9);rnQuery OK, 6 rows affected (0.02 sec)rnRecords: 6 Deleted: 0 Skipped: 0 Warnings: 0rn[/code]rnrn导入后的结果:rn[code=SQL]rnmysql> select * from t_sql \G;rn*************************** 1. row ***************************rnphone: 锘?2345rn addr: 6娴?rnemail: 鍗梛ava_boy@126.comrn*************************** 2. row ***************************rnphone: 468872rn addr: 缇庡浗rnemail: java_boy@163.comrn*************************** 3. row ***************************rnphone: 985435rn addr: 浜戝崡rnemail: sinaboy@126.comrn*************************** 4. row ***************************rnphone: 036597rn addr: 闈炴床rnemail: java_boy@sina.comrn*************************** 5. row ***************************rnphone: 698743rn addr: 娉板畨rnemail: java@vip.comrn*************************** 6. row ***************************rnphone: 456987rn addr: 涓婃捣rnemail: testsqk@nba.comrn6 rows in set (0.00 sec)rn[/code]rnrn[code=SQL]rn*************************** 1. row ***************************rnphone: 锘?2345rn addr: 6娴?rnemail: 鍗梛ava_boy@126.comrn[/code]rn第一行,的数据是223456济南java_boy@126.comrn为什么导入后会乱码呢?rn其他行的addr在客户端显示是乱码,但是我用mysql的工具查看中文是没有乱码的 论坛

没有更多推荐了,返回首页