协慌网

登录 贡献 社区

如何以 CSV 格式输出 MySQL 查询结果?

有没有一种简单的方法可以从 Linux 命令行运行 MySQL 查询并以CSV格式输出结果?

这就是我现在正在做的事情:

mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

当有很多列需要用引号括起来,或者结果中有引号需要转义时,它会变得混乱。

答案

来自http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

使用此命令将不会导出列名称。

另请注意,/ /var/lib/mysql-files/orders.csv mysql- /var/lib/mysql-files/orders.csv将位于运行 MySQL 的服务器上。运行 MySQL 进程的用户必须具有写入所选目录的权限,否则命令将失败。

如果要从远程服务器(尤其是托管或虚拟机,如 Heroku 或 Amazon RDS)将输出写入本地计算机,则此解决方案不适用。

$ mysql your_database --password=foo < my_requests.sql > out.csv

哪个是制表符分隔。像这样管道以获得真正的 CSV(感谢 @therefromhere):

... .sql | sed 's/\t/,/g' > out.csv

mysql --batch,-B

使用制表符作为列分隔符打印结果,每行都在新行上。使用此选项,mysql 不使用历史记录文件。批处理模式导致非表格输出格式和特殊字符的转义。可以使用原始模式禁用转义; 请参阅 --raw 选项的说明。

这将为您提供一个制表符分隔文件。由于逗号(或包含逗号的字符串)未进行转义,因此将分隔符更改为逗号并不简单。