使用SELECT INTO OUTFILE可将MySQL查询结果导出为CSV或TXT文件,需注意secure_file_priv限制路径,可通过修改配置文件设置导出目录,也可用命令行结合sed格式化输出。

在MySQL中,导出查询结果为文件是一个常见需求,比如用于数据分析、备份或与其他系统共享数据。可以通过 SELECT ... INTO OUTFILE 语句将查询结果直接保存到服务器本地文件中,这是最常用的方法。
使用 SELECT INTO OUTFILE 导出查询结果
该方法可以将查询的数据导出为 CSV、TXT 等格式的文件,存储在数据库服务器上。
基本语法如下:SELECT 列名 FROM 表名 WHERE 条件 INTO OUTFILE '文件路径' FIELDS TERMINATED BY '分隔符' ENCLOSED BY '包围符' LINES TERMINATED BY '行结束符';
例如,将 user 表中 status 为 1 的用户导出为 CSV 文件:
SELECT id, name, email FROM user WHERE status = 1
INTO OUTFILE '/tmp/users_active.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';说明:
- FIELDS TERMINATED BY ',':字段之间用逗号分隔
- ENCLOSED BY '"':每个字段用双引号包围
- LINES TERMINATED BY '\n':每行以换行符结束
导出文件的路径限制
MySQL 默认只允许将文件写入特定的安全目录(如 secure_file_priv 设置的路径)。
查看当前允许的导出路径:
SHOW VARIABLES LIKE 'secure_file_priv';
如果返回 NULL,则表示不允许导出;需在配置文件中设置路径。
解决方法:修改 my.cnf 或 my.ini 文件,添加:
[mysqld] secure_file_priv = /tmp/
然后重启 MySQL 服务。
导出为其他格式示例
也可以导出为制表符分隔的文本文件:
SELECT id, name, created_at FROM orders INTO OUTFILE '/tmp/orders.txt' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
或者导出带标题的 CSV(MySQL 不直接支持导出标题行,可通过联合查询模拟):
(SELECT 'ID', 'Name', 'Email') UNION ALL (SELECT id, name, email FROM user WHERE status = 1) INTO OUTFILE '/tmp/users_with_header.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
通过命令行客户端导出(无需 INTO OUTFILE)
如果无法使用 INTO OUTFILE(如权限不足),可以在 Linux 命令行使用 mysql 客户端重定向输出:
mysql -u用户名 -p密码 -D数据库名 -e "SELECT * FROM user;" > /path/to/output.csv
配合选项可格式化输出:
mysql -u用户名 -p密码 -D数据库名 \ --batch --raw \ -e "SELECT id,name,email FROM user" | sed 's/\t/,/g' > /tmp/user_export.csv
--batch 会禁用列对齐,用 tab 分隔,再用 sed 转为逗号分隔。
基本上就这些。根据权限和环境选择合适的方式,优先使用 INTO OUTFILE,注意路径权限问题。










