如何以csv格式输出MySQL查询结果(到屏幕,而不是文件)?

如何以csv格式输出MySQL查询结果(到屏幕,而不是文件)?,mysql,csv,Mysql,Csv,我正在尝试使用mysql命令行工具以逗号分隔的格式输出查询结果。我的mysql用户无权使用此问题中引用的“输入输出文件”选项: 我也知道-H和-X选项分别以html和xml格式输出,但是没有办法将csv格式直接输出到屏幕上吗 我发现这个方法使用sed-。但是,我很想找到一个直接的mysql解决方案 有什么想法吗?我已经使用MySQL多年了,除了您已经找到的解决方案之外,我不知道有什么方法可以单独使用MySQL命令行客户端来生成CSV输出 文件中有两个CSV输出支持的功能请求: 我建议的

我正在尝试使用mysql命令行工具以逗号分隔的格式输出查询结果。我的mysql用户无权使用此问题中引用的“输入输出文件”选项:

我也知道-H和-X选项分别以html和xml格式输出,但是没有办法将csv格式直接输出到屏幕上吗

我发现这个方法使用sed-。但是,我很想找到一个直接的mysql解决方案


有什么想法吗?

我已经使用MySQL多年了,除了您已经找到的解决方案之外,我不知道有什么方法可以单独使用
MySQL
命令行客户端来生成CSV输出

文件中有两个CSV输出支持的功能请求:


我建议的唯一其他解决方案是用Perl或PHP编写一个脚本,从MySQL获取数据并以CSV格式或任何其他您想要的格式输出。这不是一个难写的脚本

如果您有权访问mysqldump,您可以使用类似的东西

mysqldump -u [username] -p -t -T/path/to/directory [database] --fields-enclosed-by=\; --fields-terminated-by=,

最后,我只是将制表符分隔的输出复制粘贴到电子表格中,然后将其导出到csv。我还意识到我本可以使用concat或concat_ws函数来完成这项工作,并且下次会这样做


从表中选择CONCAT_WS(“,”,field1,field2,field3)

CLI可以以制表符分隔的格式输出,这已经足够好了(我是根据经验说的)。使用-B选项。使用制表符分隔的最大问题是,我无法使Excel导入该格式。但是,OpenOffice确实如此。

如果您安装了MySQL Workbench,您可以运行查询,然后单击结果上方的“导出”。它将为您提供另存为.CSV的选项。

如果您以交互方式使用mysql,您可以将寻呼机设置为使用sed,如下所示:

$ mysql -u <user> p<passwpd>
mysql> pager sed 's/,/\n/g'
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah

.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"
"blah":"blah","blah":"blah","blah":"blah"
awk -F\\t '{print "\""$1"\","$2","$3}'
如果您需要引用ouput字段,比如$1,您的awk打印将如下所示:

$ mysql -u <user> p<passwpd>
mysql> pager sed 's/,/\n/g'
PAGER set to 'sed 's/,/\n/g''
mysql> SELECT blah FROM blah WHERE blah = blah

.
.
.
"blah":"blah"
"blah":"blah"
"blah":"blah"
"blah":"blah","blah":"blah","blah":"blah"
awk -F\\t '{print "\""$1"\","$2","$3}'
遵循


mysql--跳过列名--batch-e'select*from dump3't | awk-F'\t''{sep=”“;for(i=1;i将答案导入
tr
,如下所示:

mysql <blah blah> -B | tr '\t' ','
mysql-B | tr'\t','

很高兴知道我没有遗漏一些明显的东西。谢谢!谢谢你的想法。我认为这可以解决我的权限问题。但我必须进一步过滤记录和字段,因为它会转储整个表,我只是尝试获取表的一小部分。mysqldump的最新版本为providin使用了-w参数将WHERE子句添加到转储表中。谢谢,那将是一个很好的选择。这只在您可以访问数据库服务器时才有效,因为
-T/path/to/directory
指的是MySQL服务器上的目录,而不是本地机器上的目录。因此,这不能用于云中的大多数数据库。确切地说,我使用了-B选项并获取了输出并将其粘贴到数字中,似乎可以接受。谢谢,这非常有效。然后您可以使用sed将其设置为CSV。确保在sed语句的选项卡之前键入Ctrl-V。mysql-B-uroot foo-e“选择电子邮件,来自电子邮件注册的国家/地区”| sed-e's/,/g'>foo.CSV您可能需要使用“-silent”选项删除表格输出。请参阅Ca使用
CONCAT_WS()
加油,因为它将跳过
NULL
值(导致列计数不均匀)。您可能需要使用类似于
IFNULL(列“”)的方法
以避免此问题。这肯定比公认的答案复杂得多。为什么这样更好?您好,因为所有这些解决方案都会传播相同的错误。不要满足CSV格式的基本规则:*必须引用嵌入逗号或双引号字符的字段。*每个嵌入的双引号字符都必须重新表示由一对双引号字符括起。*带有嵌入换行符的字段必须被引号括起。只有在没有逗号或逗号的情况下,结果才是正确的“值中也没有新行字符。例如,这两列的结果无法正确读取:mysql>select*from csvdata;| column1 | column2 |+--------------------------------------------------------------------------------++| Super,“豪华”truck第二列和另一个逗号用csvdata中的SELECT CONCAT_WS
mysql>SELECT CONCAT_WS(',',column1,column2)回答;+----------------------------------------------------------------+|超级,“豪华”truck第二列和另一个逗号
用awk回答(sed示例也是如此):
mysql--raw--skip column names-uroot-pt-e'select*来自csvdata'| awk-F\\t'{print“\”“$1”、“$2}”Super、“豪华”truck、“第二列”和另一个逗号,正如您看到的,由于与和混淆,无法区分正确的字段“好吧,这很有道理。不过你应该在答案中加上这一点,特别是因为它已经超过7年了,并且包含了一个公认的解决方案。啊,它遗漏了尖括号中的内容……我是说mysql{blah blah}-B。。。