如何将MySql表导出/转储到文本文件中,包括字段名称(又名标题或列名称)

How to export / dump a MySql table into a text file including the field names (aka headers or column names)

提问人:Dan Goldstein 提问时间:11/5/2008 最后编辑:Maksym GontarDan Goldstein 更新时间:10/24/2023 访问量:49500

问:

在MySql的解释器中,很容易将表及其字段名称转储到屏幕上。

似乎没有简单的方法可以将表格导出到制表符或 CSV 输出文件,包括其列标题。

我尝试仅使用 SQL 或 Linux 命令行来执行此操作,而无需用其他语言编写程序。

谢谢

MySQL 导出 标头 字段

评论


答:

21赞 Vinko Vrsalovic 11/5/2008 #1

通过管道将查询传递到命令行客户端会输出一个制表符分隔的列表,其中列名称作为第一行

$ echo "select * from surveys limit 5" | mysql -uroot -pGandalf surveys
phone   param1  param2  param3  param4  p0      p1      p2      p3      audio4  code    time
XXXXXXXXX       2008-07-02      11:17:23        XXXXXXXX        SAT     -       -       -       -       -       ERROR   2008-07-02 12:18:32
XXXXXXXXX       2008-07-02      11:22:52        XXXXXXXX        SAT     -       -       -       -       -       COLGADO 2008-07-02 12:04:29
XXXXXXXXX       2008-07-02      11:41:29        XXXXXXXX        SAT     -       -       -       -       -       COLGADO 2008-07-02 12:07:22
XXXXXXXXX       2008-07-02      12:16:19        XXXXXXXX        SAT     1       1       1       9       XXXXXXXXX_4.wav     OK      2008-07-02 16:14:27
XXXXXXXXX       2008-07-02      08:21:25        XXXXXXXX        SAT     1       1       1       1       XXXXXXXXX_4.wav     OK      2008-07-02 12:29:40

评论

3赞 janetsmith 8/3/2011
这是一个 hack 而不是 mysql 提供的功能。我想它可能不适用于其他操作系统。
2赞 Vinko Vrsalovic 8/5/2011
这本身不是黑客攻击。当然,它可能不适用于不提供正常命令行界面和 mysql 命令行客户端的系统。
0赞 LarsH 4/18/2015
这会正确引用(转义)列名和数据吗?
0赞 aiffin 1/22/2018
我以这种方式使用,感谢@VinkoVrsalovic回声“从wp_users中选择user_pass”|mysql -uroot -proot wp_database > passwordList.txt
1赞 Dana the Sane 11/5/2008 #2

您可以使用 mysqldump 命令执行此操作。请查看 --tab 和 --xml 选项。

评论

0赞 Dan Goldstein 4/22/2009
我对此进行了测试,但结果并不令人满意。即“sudo mysqldump --user=root --pass=mypass -T /home/mydir mydb mytable”产生“mysqldump:出现错误:1:无法创建/写入文件'/home/mydir/mytable.txt'(错误代码:13)执行'SELECT INTO OUTFILE'”
0赞 Dana the Sane 4/22/2009
为此,您不需要使用 sudo。只需确保您从有权写入输出文件夹的帐户运行 mysqldump,这似乎就是错误所在。
1赞 Dan Goldstein 4/22/2009
好的,通过创建一个具有 777 个权限的目录来解决这个问题。但是,它没有输出列名,只输出数据。
0赞 Dana the Sane 4/22/2009
确保检查文件的顶部,通常这些工具会先转储架构,然后再转储数据。如果您想要一个制表符分隔的文件,标题中包含列,则可能需要使用 --xml 并执行第二个转换步骤。
9赞 cafe876 4/2/2012 #3

这个小脚本应该这样做:

-- 1.在此处选择表格和输出文件/这应该是唯一的输入

select 'mytable' into @tableName;
select 'c://temp/test.csv' into @outputFile;

-- 2.以适合查询的格式获取列名称

select group_concat(concat("'",column_name, "'")) into @columnNames from information_schema.columns
where table_name=@tableName;

-- 3.生成查询

SET @query = CONCAT(
"select * from
((SELECT ",@columnNames,")
UNION
(SELECT * FROM `",@tableName,"`)) as a
INTO OUTFILE '", @outputFile, "'");

-- 4.执行查询

PREPARE stmt FROM @query;
EXECUTE stmt;

评论

1赞 Chris Markle 10/23/2012
按“SELECT * ...”排序的列是否是否与 information_schema.columns 查询中列出的列的顺序相同?不是在这里拖钓 - 只是好奇......
0赞 giordano 9/12/2013
@cafe876:感谢您的解决方案。我只是想知道为什么需要撇号。如果我删除两个撇号,查询将不起作用。如果我想在以下行添加约束(例如:SELECT 'x > 1' INTO @constr):(SELECT * FROM WHERE “,@cosntr,)) as a” ->这不起作用。有什么想法吗?",@tableName,"
0赞 LarsH 4/18/2015
@giordano:如果你想得到一个答案,你可能需要更好地定义“不起作用”;例如,您看到了什么错误消息?您可能还需要提出一个单独的问题。但是,反引号允许您使用包含异常字符的列名。
4赞 aizquier 6/23/2012 #4

我是这样实现的:

echo "select * from table"| mysql database -B -udbuser -puser_passwd | sed s/\\t/,/g > query_output.csv

mysql 的 -B 选项通过制表符分隔列,制表符使用 sed 转换为逗号。请注意,标头也会生成。

评论

2赞 thekingoftruth 5/2/2013
顺便说一句,我不得不在 OSX 上用 .\\tCtrl-Vt
0赞 crlane 6/27/2013
@thekingoftruth 谢谢你!否则,输出中的所有字母 t 都将替换为逗号。
0赞 LarsH 4/18/2015
请注意,如果任何导出的值包含逗号,则无法正确转义或引用它们。
0赞 Lifeboy 6/24/2012 #5

我创建了一个过程,通过使用 自动将大量表的内容导出到 .csv 文件。如果您需要这样的东西,请参阅以下内容SELECT ... INTO OUTFILE

http://lifeboysays.wordpress.com/2012/06/23/mysql-how-to-export-data-to-csv-with-column-headers/

它使用 cafe876 描述的方法,但适用于一个或整个系列的表,此外,您还可以设置要使用的分隔符和引号字符。

评论

0赞 thekingoftruth 5/1/2013
之后无法找到该文件...哈哈。
0赞 Lifeboy 11/26/2018
thekingoftruth:如果你看一下脚本,你会发现输出默认为“/tmp”。文件将在那里,但您可以指定任何位置,例如您想要的位置,如下所示: CALL export_important_tables('“',',','/home/steviewonder/');如果你因此投了反对票,请删除反对票,好吗?
0赞 aiffin 1/22/2018 #6

我使用了上面的命令,并根据我的要求进行了修改。
我需要从文本文件中的wordpress mysql数据库中获取密码列,为此我使用了以下命令

echo "select user_pass from wp_users"| mysql -uroot -proot wp_database > passwordList.txt
0赞 Podbrushkin 10/24/2023 #7

问题是关于如何仅使用 SQL 或 Bash 导出单个表,但如果有人有兴趣使用列名转储整个数据库,这就是使用 Powershell 完成的方法。

在所选的空目录中启动 Powershell,并逐个执行以下命令:

# Set these variables, they will be used in subsequent commands:
$mysqlUsername = 'root'
$mysqlPassword = 'qwerty'
$mysqlDatabase = 'dbname'

# Stop mysql server if it's already running:
'shutdown;' | mysql -u $mysqlUsername "-p$mysqlPassword"

# Start mysql server in new console window with read permissions: 
Start-Process mysqld --secure-file-priv=

# Dump all tables to current directory:
mysqldump -u $mysqlUsername "-p$mysqlPassword" $mysqlDatabase --tab=.

# Populate $files variable with created files:
$files = Get-Item *.txt

# Every file is named after a table it contains. So for each file we will query server for corresponding table, extract first line from the response and prepend this line to original file:
$files | % {
 $f = $_
 $sql = "select * from $($f.BaseName) limit 1;"
 $resp = $sql | mysql -u $mysqlUsername "-p$mysqlPassword" $mysqlDatabase
 (Get-Content -Raw $f) | % { $resp[0] + "`n" + $_ } | Set-Content -NoNewline $f
}

# Finally, shutdown the server:
'shutdown;' | mysql -u $mysqlUsername "-p$mysqlPassword"

现在,当前目录包含带有列名的 TSV 中的整个数据库。但是,如果数据库具有空表,则尚未提取其列名。