提问人:Dan Goldstein 提问时间:11/5/2008 最后编辑:Maksym GontarDan Goldstein 更新时间:10/24/2023 访问量:49500
如何将MySql表导出/转储到文本文件中,包括字段名称(又名标题或列名称)
How to export / dump a MySql table into a text file including the field names (aka headers or column names)
问:
在MySql的解释器中,很容易将表及其字段名称转储到屏幕上。
似乎没有简单的方法可以将表格导出到制表符或 CSV 输出文件,包括其列标题。
我尝试仅使用 SQL 或 Linux 命令行来执行此操作,而无需用其他语言编写程序。
谢谢
答:
通过管道将查询传递到命令行客户端会输出一个制表符分隔的列表,其中列名称作为第一行
$ 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
评论
您可以使用 mysqldump 命令执行此操作。请查看 --tab 和 --xml 选项。
评论
这个小脚本应该这样做:
-- 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;
评论
",@tableName,"
我是这样实现的:
echo "select * from table"| mysql database -B -udbuser -puser_passwd | sed s/\\t/,/g > query_output.csv
mysql 的 -B 选项通过制表符分隔列,制表符使用 sed 转换为逗号。请注意,标头也会生成。
评论
\\t
Ctrl-V
t
我创建了一个过程,通过使用 自动将大量表的内容导出到 .csv 文件。如果您需要这样的东西,请参阅以下内容SELECT ... INTO OUTFILE
http://lifeboysays.wordpress.com/2012/06/23/mysql-how-to-export-data-to-csv-with-column-headers/。
它使用 cafe876 描述的方法,但适用于一个或整个系列的表,此外,您还可以设置要使用的分隔符和引号字符。
评论
我使用了上面的命令,并根据我的要求进行了修改。
我需要从文本文件中的wordpress mysql数据库中获取密码列,为此我使用了以下命令
echo "select user_pass from wp_users"| mysql -uroot -proot wp_database > passwordList.txt
问题是关于如何仅使用 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 中的整个数据库。但是,如果数据库具有空表,则尚未提取其列名。
评论