MySQL直接导出CSV文件,并解决中文乱码的问题

时间:2022-10-09 15:01:03

需求:

  需要导出hr_users 表中的部分字段的数据,以前是用PHP写脚本,然后导出CSV文件。

  在MySQL中,它自己就能导出CSV文件 ,只不过是有如下几个问题需要大家解决。

  1. 生成文件不成功,没有读写权限

  2.导出数据为中文乱码

  3.数据没有格式化,阅读不方便

解决方案:

如果使用 select  ... into  outfile ...方式导出数据,需要分为两种情况 :
1. windows系统下:可以随意指定对应的目录 。
2. linux 系统下 :
(1)不指定目录 ,默认在当前导出数据库数据目录下 ,例如  /var/lib/mysql/db_name 
(2) 指定目录时,默认只能指定 /tmp目录 。否则回报 “ ERROR 1 (HY000) at line 1: Can't create/write to file '/xxxx/xxxx/xxx.csv' (Errcode: 13)” 错误 !导致原因是因为权限问题,修改起来比较麻烦 !可以放到/tmp/目录下,然后cp到其它你想存放的目录。【

推荐使用这种方法】

对于中文乱码的问题,有两种解决方案

1.user表是utf8编码,excel默认编码格式是GBK,excel直接打开时候是一堆乱码。后来想了一个办法中转,先保存成为txt格式,excel打开txt时候会提示选择用哪种编码方式打开,选择utf8解决。

2.导出时候加上CHARACTER SET gbk 即可【推荐使用】

关于数据格式化的问题,需要给导出的字段传递一些参数

 fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\r\n'

这个参数是根据RFC4180文档设置的,该文档全称Common Format and MIME Type for Comma-Separated Values (CSV) Files,其中详细描述了CSV格式,其要点包括:

(1)字段之间以逗号分隔,数据行之间以\r\n分隔;

(2)字符串以半角双引号包围,字符串本身的双引号用两个双引号表示。

terminated by分隔符:意思是以什么字符作为分隔符
enclosed by字段括起字符
escaped by转义字符
terminated by描述字段的分隔符,默认情况下是tab字符(\t) 
enclosed by描述的是字段的括起字符。
escaped by描述的转义字符。默认的是反斜杠(backslash:\ )  
 

一个完整的实例如下所示:

 select id , tel,email from hr_users limit  into outfile '/tmp/junjun.csv' character set gbk 
fields terminated by ',' optionally enclosed by '"'
lines terminated by '\n';