是否有一种简单的方法可以从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
当有很多列需要用引号括起来时,或者如果结果中有需要转义的引号,就会变得混乱。
是否有一种简单的方法可以从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
当有很多列需要用引号括起来时,或者如果结果中有需要转义的引号,就会变得混乱。
当前回答
Use:
mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv
其他回答
不完全是CSV格式,但是MySQL客户端的tee命令可以用来将输出保存到本地文件中:
tee foobar.txt
SELECT foo FROM bar;
你可以使用notee禁用它。
SELECT…INTO OUTFILE…的问题;它需要在服务器上写文件的权限。
从Save MySQL查询结果到一个文本或CSV文件:
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';
注意:该语法可能需要重新排序
SELECT order_id,product_name,qty
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM orders
WHERE foo = 'bar';
在MySQL的最新版本。
使用此命令,将不会导出列名。
还要注意/var/lib/ MySQL -files/orders.csv将在运行MySQL的服务器上。MySQL进程运行所在的用户必须具有写入所选目录的权限,否则该命令将失败。
如果您想从远程服务器(特别是托管或虚拟机,如Heroku或Amazon RDS)向本地机器写入输出,则此解决方案不适合。
mysql your_database --password=foo < my_requests.sql > out.tsv
这将产生一个制表符分隔的格式。如果你确定逗号没有出现在任何列数据中(选项卡也没有),你可以使用这个管道命令来获得一个真正的CSV(感谢用户John Carter):
... .sql | sed 's/\t/,/g' > out.csv
通过'tr'管道(仅限Unix/Cygwin):
mysql <database> -e "<query here>" | tr '\t' ',' > data.csv
注意:这既不处理嵌入的逗号,也不处理嵌入的制表符。
您可以有一个使用CSV引擎的MySQL表。
然后你的硬盘上就会有一个CSV格式的文件,你可以直接复制而不用处理它。