用sqlyog导入mysql中文数据乱码问题
2018-03-08 10:43
639 查看
我一直都使用sqlyog客户端进行操作mysql数据库,导入导出都是非常方便操作的,一开始导入excel(.xlsx)以及csv文件还遇到一些困难,后来经常摸索也就解决了,但是这两天在导入数据的问题上遇到了一个难题,以至于我后来想通过程序读取excel文件然后写入数据库,但是我工作的时候被各种其他需求给打断了,写了一段代码就半途中断了,我想总有办法解决的.
每次导入excel,即.xlsx结尾的文件,从来没有过乱码的问题,但是供应商给的文件是csv的,按道理说改为.xlsx然后再导入也没有问题,但是这个csv文件的大小是1个多G,行数超过了200多万,而在win平台下,打开excel文件最多显示104万多行,转为excel后就丢失了后面的数据,导入也是缺失的数据,因此这是没用的.
我尝试改变了数据库的编码和数据表以及字段的编码,照着网上的一些做法,操作了一些下面的命令:
SHOW VARIABLES LIKE 'character%'
![](https://img-blog.csdn.net/20180308103530259?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
于是网上说csv文件可能是gbk编码,我操作了下面
SET character_set_client='gbk';
SET CHARACTER_SET_CONNECTION='gbk';
SET character_set_database='gbk';
SET character_set_results='gbk';
SET character_set_server='latin1';
不管用,于是改回来
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';
改为utf8不行,改为gbk,又改为gb2312,改什么my.ini配置文件和data目录下的相应的数据库的db.opt都是不行,我就奇怪了,到底哪里的问题,我同事用mac导入,根本都没有这个问题,到底问题出在哪里,我始终没解决,最后尝试用cmd导入,命令如下:
LOAD DATA LOCAL INFILE 'D:\\w0307\\11.csv'
INTO TABLE `历史数据导出 - 广东_csv` CHARACTER SET utf8
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
'D:\\w0307\\11.csv':是我本地csv文件的路径,
`历史数据导出 - 广东_csv`:是导入的数据库的表名,这个表要提前新建好的,但是导入excel是不需要提前建表的,这里就有点弱了
下面说到的就是CHARACTER SET utf8,我还是不明白,因为我在用sqlyog进行设置表字段的时候,也是把表字段设置为了utf8的编码的,当时导入的数据确实是乱码,不然我也不会想到用cmd进行操作了,如果上述提醒你ERROR 1300 (HY000): Invalid utf8 character string: '',那么你就把CHARACTER SET utf8 改为CHARACTER SET gbk,别问我为什么,我不知道,亲测可行,并且建表的语句是default charset=utf8;截图为证明:
![](https://img-blog.csdn.net/2018031313420486?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180313134226932?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
而且此时插入表里的数据没有一点乱码,截图为证:
![](https://img-blog.csdn.net/20180313134401987?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
然后我又用ueditor打开看了一些csv文件的编码,却发现了这样的内容:
![](https://img-blog.csdn.net/20180313135811468?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
难道说导入语句的character set utf8是指csv文件的编码吗?于是我又改变了csv文件的编码为utf8,导入的时候character set utf8果然是可以的了,看来这个编码是指csv文件的编码
但是这样导入,确实可以了,由于工作比较忙,就赶紧对数据进行curd等操作了,等有空还要仔细研究一下到底为什么,这里暂记一下.
接下来测试用命令行导出csv文件的问题,命令如下:
select * from wz0308
into outfile 'D:\\wz0308.csv'
fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\r\n';
但是结果会出现以下错误:
那么在我的my.ini里面的配置是这样的,网上说前面加#注释掉就行了,我测试并非如此,查了原因,网上这么说:
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为D:/XXXX ,表示限制mysqld 的导入|导出只能发生在D:/XXXX目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
那么我此时是
![](https://img-blog.csdn.net/20180309104018378?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
那么说明我用mysqld根本都没有权限了,奇怪我设置了给注释了,变成了null,本来是想不限制目录的,现在是直接把权限给关了,
转念一想,null和没有值是不一样的,于是在关闭mysql服务后,在my.ini中设置为了下面一行:
![](https://img-blog.csdn.net/2018030910423236?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
现在是这样,重启mysql服务后:
![](https://img-blog.csdn.net/20180309104316967?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
再次执行:
![](https://img-blog.csdn.net/20180309104337243?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
表示导出已经成功了.
但是查看文件:
![](https://img-blog.csdn.net/20180309104537942?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
发现是没有表头的,也就是字段名没有标上去,查看网上的教程,那么就是要查询的时候先查出一行,把表字段名给手动查出来,语句如下:
![](https://img-blog.csdn.net/20180309105032849?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
执行是成功的,那么看看效果:
![](https://img-blog.csdn.net/20180309105050989?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2lsa19qYXZh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
看来是有了
每次导入excel,即.xlsx结尾的文件,从来没有过乱码的问题,但是供应商给的文件是csv的,按道理说改为.xlsx然后再导入也没有问题,但是这个csv文件的大小是1个多G,行数超过了200多万,而在win平台下,打开excel文件最多显示104万多行,转为excel后就丢失了后面的数据,导入也是缺失的数据,因此这是没用的.
我尝试改变了数据库的编码和数据表以及字段的编码,照着网上的一些做法,操作了一些下面的命令:
SHOW VARIABLES LIKE 'character%'
于是网上说csv文件可能是gbk编码,我操作了下面
SET character_set_client='gbk';
SET CHARACTER_SET_CONNECTION='gbk';
SET character_set_database='gbk';
SET character_set_results='gbk';
SET character_set_server='latin1';
不管用,于是改回来
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';
改为utf8不行,改为gbk,又改为gb2312,改什么my.ini配置文件和data目录下的相应的数据库的db.opt都是不行,我就奇怪了,到底哪里的问题,我同事用mac导入,根本都没有这个问题,到底问题出在哪里,我始终没解决,最后尝试用cmd导入,命令如下:
LOAD DATA LOCAL INFILE 'D:\\w0307\\11.csv'
INTO TABLE `历史数据导出 - 广东_csv` CHARACTER SET utf8
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
'D:\\w0307\\11.csv':是我本地csv文件的路径,
`历史数据导出 - 广东_csv`:是导入的数据库的表名,这个表要提前新建好的,但是导入excel是不需要提前建表的,这里就有点弱了
下面说到的就是CHARACTER SET utf8,我还是不明白,因为我在用sqlyog进行设置表字段的时候,也是把表字段设置为了utf8的编码的,当时导入的数据确实是乱码,不然我也不会想到用cmd进行操作了,如果上述提醒你ERROR 1300 (HY000): Invalid utf8 character string: '',那么你就把CHARACTER SET utf8 改为CHARACTER SET gbk,别问我为什么,我不知道,亲测可行,并且建表的语句是default charset=utf8;截图为证明:
而且此时插入表里的数据没有一点乱码,截图为证:
然后我又用ueditor打开看了一些csv文件的编码,却发现了这样的内容:
难道说导入语句的character set utf8是指csv文件的编码吗?于是我又改变了csv文件的编码为utf8,导入的时候character set utf8果然是可以的了,看来这个编码是指csv文件的编码
但是这样导入,确实可以了,由于工作比较忙,就赶紧对数据进行curd等操作了,等有空还要仔细研究一下到底为什么,这里暂记一下.
接下来测试用命令行导出csv文件的问题,命令如下:
select * from wz0308
into outfile 'D:\\wz0308.csv'
fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\r\n';
但是结果会出现以下错误:
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
在网上查的一下原因,大概是没有mysql配置问题,网上这么说:show global variables like '%secure%';结果是:secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
那么在我的my.ini里面的配置是这样的,网上说前面加#注释掉就行了,我测试并非如此,查了原因,网上这么说:
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为D:/XXXX ,表示限制mysqld 的导入|导出只能发生在D:/XXXX目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
那么我此时是
那么说明我用mysqld根本都没有权限了,奇怪我设置了给注释了,变成了null,本来是想不限制目录的,现在是直接把权限给关了,
转念一想,null和没有值是不一样的,于是在关闭mysql服务后,在my.ini中设置为了下面一行:
现在是这样,重启mysql服务后:
再次执行:
表示导出已经成功了.
但是查看文件:
发现是没有表头的,也就是字段名没有标上去,查看网上的教程,那么就是要查询的时候先查出一行,把表字段名给手动查出来,语句如下:
执行是成功的,那么看看效果:
看来是有了
相关文章推荐
- Navicat for MySQL 导出来的数据再用SQLyog导入,出现中文乱码的原因
- 2015.10.22小结Mysql中文乱码问题完美解决方案(包括建库、导入数据、网页)
- 数据文件导入mysql时出现中文乱码问题
- mysql使用sql导入数据中文乱码问题
- Mysql中文乱码问题完美解决方案(包括建库、导入数据、网页)
- mysql导入csv中文数据乱码问题分析与解决
- 关于mysql导入数据中文乱码问题解析
- 关于Java调用批处理命令向mysql导入数据的中文乱码有关问题
- mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)
- 解决数据库导入mysql时中文乱码问题
- 再谈乱码问题,如何解决MYSQL数据中文乱码问题
- 再谈乱码问题,如何解决MYSQL数据中文乱码问题
- 关于mysql导入中文乱码问题的理解
- mysql 导入数据文件/文本文件 后 中文乱码
- 解决Java Web开发中Jsp存储读取MySQL数据中文乱码的问题
- MYSQL数据抽取从utf8 到ORACLE ZHS16GBK 中文乱码的问题
- mysql导入导出数据中文乱码解决方法小结
- mysql数据导入中文乱码的解决办法
- ado.net关于mysql数据中文乱码问题
- 再谈乱码问题,如何解决MYSQL数据中文乱码问题