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

问题描述 投票:0回答:7

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

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

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

谢谢你

mysql export header field
7个回答
21
投票

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

$ 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

9
投票

这个小脚本应该可以做到:

-- 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;

4
投票

我通过这种方式实现了这一目标:

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

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


1
投票

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


0
投票

我创建了一个程序,可以使用

SELECT ... INTO OUTFILE
自动将大量表格的内容导出到 .csv 文件。如果您有这样的需求,请参考以下内容

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

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


0
投票

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

echo "select user_pass from wp_users"| mysql -uroot -proot wp_database > passwordList.txt

0
投票

问题是关于如何仅使用 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 中的整个数据库以及列名称。但是,如果您的数据库有空表,则它们的列名尚未提取。

© www.soinside.com 2019 - 2024. All rights reserved.