作为测试,我们这里使用了名为testdb的数据库中的名为test_table的表,首先我们使用如下SQL来查看其中有何数据:
select * from testdb.test_table
数据如下:
id
name
age
point
brief
1
刘德华
23
96.12
我爱你亲爱的姑娘
2
周杰伦
22
93.20
七里香
3
0
0.00
4
周润发
0
0.00
"有没有人曾告诉你"
然后在命令行执行如下指令尝试导出CSV文件:
mysqldump -uroot -p testdb test_table -t -T "D:/test/data/" --fields-enclosed-by="\" --fields-terminated-by=","
然后就看到报错了:
SQL 错误 [1290] [HY000]: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
然后我们在MySQL命令行下执行:
show variables like '%secure%'
看到结果:
Variable_name |Value |
-------------------------|-----------------------------------------------|
require_secure_transport |OFF |
secure_auth |ON |
secure_file_priv |C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\ |
这里的secure_file_priv表示我们默认只能将导出的文件放到这个位置:C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\
我们这里尝试将C:\ProgramData\MySQL\MySQL Server 5.7目录下的my.ini文件进行如下修改:
在
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
这一行前面加一个#改为:
# secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
然后在命令行执行services.msc进入服务管理界面,重启mySQL5.7对应的服务。
但是发现这样还是不行的。
继续尝试将这一行取消掉注释,并改成:
secure-file-priv=""
然后重启MySQL服务。
执行如下命令导出结果:
mysqldump -uroot -p testdb test_table -t -T "D:/test/data/" --fields-enclosed-by="\" --fields-terminated-by=","
发现可以了,在D:/test/data/目录下生成了两个文件:
test_table.sql
test_table.txt
test_table.sql内容为空,因为-t选项设置成了表结果不导出;
test_table.txt内容如下:
\1\,\刘德华\,\23\,\96.12\,\我爱你亲爱的姑娘\
\2\,\周杰伦\,\22\,\93.20\,\七里香\
\3\,\\,\0\,\0.00\,\\
\4\,\周润发\,\0\,\0.00\,\"有没有人曾告诉你"\
这个时候发现好像哪里不对,哦,原来我双引号的地方没有填写好,暂时还不知道怎么办,所以尝试下面这种办法。
我们可以执行如下SQL在MySQL命令行下导出数据:
SELECT * INTO OUTFILE 'D:/test20181120.csv'
FIELDS TERMINATED BY ',' OPTIONALLY
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
FROM testdb.test_table;
执行完SQL后,会在D盘根目录下生成一个名为test20181120.csv的文件,内容如下:
1,"刘德华",23,96.12,"我爱你亲爱的姑娘"
2,"周杰伦",22,93.20,"七里香"
3,"",0,0.00,""
4,"周润发",0,0.00,"\"有没有人曾告诉你\""