使用 mysqldump 命令创建 CSV 文件

大家好,
我是Mandai,Wild团队负责开发工作的成员。

您是否曾经想过在 Excel 中编辑 MySQL 数据?
本文总结了如何将 MySQL 数据转换为 CSV 格式,以便在 Excel 中读取。


mysqldump 命令通常用于将 mysql 的内容写入文件,但如果没有给出特殊说明,则输出将采用 SQL 格式。

将数据传输到另一个数据库时这样做没问题,但如果您想在 Excel 中处理此文件呢?

mysqldump 命令有 --tab 选项来满足这一需求。

本次测试使用的 MySQL 版本为 MySQL Community Server 5.6.35,该版本是通过官方 MySQL 存储库安装的。

 

尝试仅使用 mysqldump 命令来获取它。

使用 mysqldump 命令检索 CSV 文件时,您经常会遇到
类似这样的

mysqldump -uroot -p --tab=/tmp hogehoge fugafuga
mysqldump:出现错误:1290:MySQL 服务器正在使用 --secure-file-priv 选项运行,因此在执行“SELECT INTO OUTFILE”时无法执行此语句

我以 root 用户身份写入,但不知为何却出现错误
。这是因为 MySQL 服务器的启动选项中包含了“--secure-file-priv”参数,这意味着文件只能写入指定的目录。

我们来看看如何验证这一点。
首先,登录MySQL。

mysql> select @@global.secure_file_priv; +--------------------------+ | @@global.secure_file_priv | +--------------------------+ | /var/lib/mysql-files/ | +--------------------------+ 1 row in set (0.00 sec)

 
默认情况下,官方存储库中的 MySQL 服务器只允许将文件写入目录 /var/lib/mysql-files/。

不可能,这太荒谬了。
我以前成功导出过SQL查询语句。

我也这么想,但那只是将mysqldump命令的输出重定向到一个文件,对吧?
关键是,mysqldump实际上并没有写入文件。

--tab 选项使 mysqldump 本身写入到“="”后面指定的路径,因此写入到“@@global.secure_file_priv”中指定的路径以外的路径将导致错误。

因此,在这种环境下,使用 --tab 选项的 mysqldump 命令的输出文件将如下所示:

mysqldump -uroot -p --tab=/var/lib/mysql-files/ hogehoge fugafuga

 
这将向 /var/lib/mysql-files/ 输出一个制表符分隔的 CSV (TSV) 文件。

 

无法访问或更改 @@global.secure_file_priv 路径。

总会有这样的时刻。

既然您别无他法,我可以考虑以下步骤:
1. 首先,使用 mysqldump 获取 SQL 语句。2
. 将输出的 SQL 语句导入到您可以控制的 MySQL 服务器。3
. 输出 CSV 文件。

如果你有时间,这样做当然可以。
你没时间或者不想这么麻烦
,你可以使用 grep 和 sed 将 SQL 转换为 CSV。

# tsv mysqldump -uroot -p -t [目标模式] [目标表] | grep 'INSERT INTO' | sed -e 's/INSERT INTO `.*` VALUES //' -e 's/);$//' -e 's/^(//' -e 's/),(/)\n(/g' -e 's/)\n/\n/g' -e 's/\n(/\n/g' -e 's/,/\t/g' -e "s/'//g" > [输出文件名]

 

# CSV(逗号分隔,双引号括起来)mysqldump -uroot -p -t [目标模式] [目标表] | grep 'INSERT INTO' | sed -e 's/INSERT INTO `.*` VALUES //' -e 's/^(/"/' -e 's/);$/"/' -e 's/),(/)\n(/g' -e "s/'//g" -e 's/)\n/"\n/g' -e 's/\n(/\n"/g' -e 's/,/","/g' > [输出文件名]

 
上述命令已在 GNU sed 4.2.1 (CentOS 6.8) 上测试通过。sed
中的替换顺序很重要,并且根据数据内容,可能会出现转换失败的情况(尤其当字符串包含“,”或“(”)时)。该命令
可以在一行内完成,不妨一试。

 
就这样。

如果您觉得这篇文章对您有帮助,请点个“赞”!
2
加载中...
2票,平均分:1.00/12
9,454
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

万代洋一

我的主要工作是开发社交游戏的Web API,但幸运的是,我也有机会参与其他各种任务,包括市场营销。
我在Beyond中的图像版权采用CC0协议。