是否有一种简单的方法可以从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
当有很多列需要用引号括起来时,或者如果结果中有需要转义的引号,就会变得混乱。
当前回答
我是这么做的:
echo $QUERY | \
mysql -B $MYSQL_OPTS | \
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' | \
mail -s 'report' person@address
Perl脚本(从别处截取)很好地将以制表符间隔的字段转换为CSV。
其他回答
Paul Tomblin给出的OUTFILE解决方案导致一个文件被写入MySQL服务器本身,因此只有当您拥有file访问权限,以及登录访问权限或从该框检索文件的其他方法时,这才会起作用。
如果您没有这样的访问权限,并且以制表符分隔的输出是CSV的合理替代品(例如,如果您的最终目标是导入到Excel),那么serbaut的解决方案(使用mysql -batch和可选的-raw)就是要走的路。
这救了我几次。它又快又有效!
——批 打印结果,使用制表符作为列分隔符,每行在 新行。 ——raw禁用字符转义(\n, \t, \0和\)
例子:
mysql -udemo_user -p -h127.0.0.1 --port=3306 \
--default-character-set=utf8mb4 --database=demo_database \
--batch --raw < /tmp/demo_sql_query.sql > /tmp/demo_csv_export.tsv
为了完整起见,您可以转换为CSV(但要小心,因为制表符可能位于字段值内部—例如,文本字段)
文件。tsv >文件
不完全是CSV格式,但是MySQL客户端的tee命令可以用来将输出保存到本地文件中:
tee foobar.txt
SELECT foo FROM bar;
你可以使用notee禁用它。
SELECT…INTO OUTFILE…的问题;它需要在服务器上写文件的权限。
使用Tim Harding发布的解决方案,我创建了这个Bash脚本来促进这个过程(根密码是需要的,但你可以很容易地修改脚本来请求任何其他用户):
#!/bin/bash
if [ "$1" == "" ];then
echo "Usage: $0 DATABASE TABLE [MYSQL EXTRA COMMANDS]"
exit
fi
DBNAME=$1
TABLE=$2
FNAME=$1.$2.csv
MCOMM=$3
echo "MySQL password: "
stty -echo
read PASS
stty echo
mysql -uroot -p$PASS $MCOMM $DBNAME -B -e "SELECT * FROM $TABLE;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > $FNAME
它将创建一个名为database.table.csv的文件
mysql your_database --password=foo < my_requests.sql > out.tsv
这将产生一个制表符分隔的格式。如果你确定逗号没有出现在任何列数据中(选项卡也没有),你可以使用这个管道命令来获得一个真正的CSV(感谢用户John Carter):
... .sql | sed 's/\t/,/g' > out.csv