如何以CSV格式输出MySQL查询结果?

会有一股神秘感。 提交于 2019-12-11 22:02:17

【推荐】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,但是我不想为了一个简单的目的而维护它。

希望有人会指出一个合适的工具,该工具已经过测试。 否则,当我找到或编写一个时,可能会更新它。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!