【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
有没有一种简单的方法可以从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
当有很多列需要用引号引起来时,或者结果中有引号需要转义时,它将变得混乱。
#1楼
MySQL Workbench可以将记录集导出为CSV,并且似乎可以很好地处理字段中的逗号。 CSV在OpenOffice中可以正常打开。
#2楼
仅限于Unix / Cygwin ,将其通过'tr'传递:
mysql <database> -e "<query here>" | tr '\t' ',' > data.csv
注意:这既不处理嵌入式逗号,也不处理嵌入式制表符。
#3楼
mysql --batch,-B
使用tab作为列分隔符打印结果,每一行都换行。 使用该选项,mysql不使用历史文件。 批处理模式导致以非表格格式输出格式并转义特殊字符。 可以通过使用原始模式来禁用转义。 请参阅--raw选项的说明。
这将为您提供一个制表符分隔的文件。 由于逗号(或包含逗号的字符串)不会被转义,因此将分隔符更改为逗号并非易事。
#4楼
使用Tim张贴的解决方案,我创建了这个bash脚本来简化此过程(要求输入root密码,但是您可以轻松地修改脚本以询问其他用户):
#!/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的文件
#5楼
到目前为止,除MySQL工作台之外,所有解决方案对于mysql db中的至少某些可能内容都是不正确的,甚至很不安全(即安全性问题)。
MYSQL Workbench(和类似的PHPMyAdmin)提供了一种形式正确的解决方案,但旨在将输出下载到用户的位置。 它们对于诸如自动数据导出之类的功能不是那么有用。
无法从mysql -B -e 'SELECT ...'
的输出中生成可靠正确的csv,因为它无法对字段中的回车符和空格进行编码。 mysql的'-s'标志确实进行了反斜杠转义,并可能导致正确的解决方案。 但是,使用脚本语言(一种具有不错的内部数据结构而不是bash的语言)和已经仔细解决了编码问题的库,要安全得多。
我曾考虑为此编写脚本,但一想到要使用的脚本,就想到以同名名字搜索预先存在的作品。 虽然我还没有彻底解决它,但是https://github.com/robmiller/mysql2csv上的解决方案看起来很有希望。 根据您的应用程序,用于指定SQL命令的yaml方法可能会或可能不会吸引人。 我也不为比我的Ubuntu 12.04笔记本电脑或Debian Squeeze服务器标配的最新版本的ruby感到高兴。 是的,我知道我可以使用RVM,但是我不想为了一个简单的目的而维护它。
希望有人会指出一个合适的工具,该工具已经过测试。 否则,当我找到或编写一个时,可能会更新它。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3141942