关于sql:MySQL查询以CSV格式打印输出到标准输出

MySQL query to print output as CSV to standard output

我想做以下 mysql -uuser -ppass -h remote.host.tld database < script.sql

其中 script.sql 包含以下

1
2
3
4
5
6
SELECT *
FROM webrecord_wr25mfz_20101011_175524
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\
'

我希望将 CSV 输出定向到标准输出。原因是使用 INTO OUTFILE 'blah.csv' 运行此查询会将文件保存在远程主机上。我希望将文件保存在本地主机上。

如果我可以将标准输出重定向到一个文件,那就太棒了。


上面的答案似乎没有完全回答最初的问题,我也不确定这是否也可以,但希望这可能对某人有所帮助:

请参阅如何以 CSV 格式输出 MySQL 查询结果?很多关于如何 sed 的评论。例如,根据原始参数,以下内容可能就足够了:

1
mysql --batch -u user -h remote.host.tld database --port 3306 -ppass -e"SELECT * FROM webrecord_wr25mfz_20101011_175524;" | sed 's/\\t/,/g' 2>&1

这类似于上面的答案,但重定向到 stdout 而不是 blah.csv.

但是,(虽然不确定如果您需要保留选项卡这是否可行,但有很多方法可以解决这个问题),我使用 https://stackoverflow.com/a/2543226/2178980 正确转义双引号并转换为逗号分隔:

1
mysql --batch -u user -h remote.host.tld database --port 3306 -ppass -e"SELECT * FROM webrecord_wr25mfz_20101011_175524;" | perl -lpe 's/"/\"/g; s/^|$/"/g; s/\\t/","/g' 2>&1
  • 通过 mysql 执行 sql "SELECT * FROM webrecord_wr25mfz_20101011_175524;" (此输出将以制表符分隔)
  • 通过管道转换为逗号分隔的 perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\\t/","/g'
  • 通过附加 2>&1 将输出转到 stdout

部分是对 MySQL SELECT INTO OUTFILE 到不同服务器的重复问题。 FIELDS TERMINATED BY 不能在没有 into outfile

的情况下使用

一个(不那么优雅的)替代方法是使用 --batch 选项来产生制表符分隔的输出和 sedding 标准输出。像这样的东西:

1
mysql --batch -uuser -ppass -h remote.host.tld database < stack.sql | sed 's/\\t/,/g' > blah.csv

请注意 --batch 会转义特殊字符,因此根据您拥有的数据及其可预测性,您可能需要更改 sed


试试这个:mysql -uuser -ppass -h remote.host.tld database < script.sql 2> blah.csv

这将重定向标准错误