将MySQL查询结果以CSV格式打印到标准输出的查询语句

20

我想要执行以下命令 mysql -uuser -ppass -h remote.host.tld database < script.sql

其中script.sql包含以下内容

SELECT *
FROM webrecord_wr25mfz_20101011_175524
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n'

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

如果我只能将标准输出重定向到文件,那就太好了。


可能是将MySQL命令行结果的输出格式更改为CSV的重复问题。 - bufh
2
不是重复的问题,这是关于路由到标准输出的问题。 - Michael Douma
3个回答

5
上面的回答似乎没有完全回答原问题,我也不确定这个能否解决问题,但希望能对某些人有所帮助:
请参考如何以CSV格式输出MySQL查询结果?,其中有很多关于如何使用sed的评论。例如,基于原始参数,以下内容可能已足够:
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://dev59.com/hnE85IYBdhLWcg3w8IXK#2543226来正确转义双引号并转换为逗号分隔。

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执行"SELECT * FROM webrecord_wr25mfz_20101011_175524;"sql语句(输出结果将以制表符分隔)
  • 通过管道符号转换为逗号分隔,使用perl -lpe 's/"/\\"/g; s/^|$/"/g; s/\t/","/g'
  • 将输出结果追加到stdout中,使用2>&1

2
这是一个与MySQL SELECT INTO OUTFILE to a different server类似的问题。如果没有into outfile,则无法使用FIELDS TERMINATED BY

一个(不太优雅的)替代方法是使用--batch选项生成制表符分隔的输出并对stdout进行sed操作。像这样:

Original Answer翻译成"最初的回答"

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

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

0
尝试这个:mysql -uuser -ppass -h remote.host.tld database < script.sql 2> blah.csv 这将重定向stderr。

6
似乎这并不能解决问题,问题是如果您不指定OUTFILE,则无法使用后续的“FIELDS TERMINATED BY”等内容,因此实际上会得到CSV输出! - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接