SELECT INTO OUTFILE是导出CSV最高效方法,但仅限MySQL服务器本地路径且受secure_file_priv限制;无权限时可用mysql命令行重定向或图形化工具导出,需注意字段分隔、引号包裹、中文编码及表头处理。

不能直接导出到你的本地电脑,SELECT INTO OUTFILE 只能把文件写到 MySQL 服务器所在的机器上,且路径受严格限制。想得到本地 CSV,得先让服务端生成,再手动拉回本地。
确认 secure_file_priv 允许的导出路径
这是第一步,也是最关键的门槛。执行:
SHOW VARIABLES LIKE 'secure_file_priv';
返回值如果是 NULL,说明导出功能被完全禁用,INTO OUTFILE 不可用;如果是一个具体路径(比如 /var/lib/mysql-files/),那只能往这个目录里写,其他路径一律报错 ERROR 1290。
常见默认路径包括:/var/lib/mysql-files/(Linux)、C:\ProgramData\MySQL\MySQL Server X.X\Uploads\(Windows),但必须以 SHOW VARIABLES 结果为准,不能猜测。
写出能被 Excel 正确识别的 CSV 语句
字段含中文、逗号或换行时,不加控制会错列、截断或乱码。必须显式声明分隔与包裹规则:
- FIELDS TERMINATED BY ',':用英文逗号分隔字段
- ENCLOSED BY '"':每个字段用双引号包住,防逗号干扰
- LINES TERMINATED BY '\n':Unix 换行(Windows 用户若需 \r\n 可显式写)
- 字段内原有双引号会被自动转义为两个双引号(Excel 兼容标准)
完整示例:
SELECT id, name, content FROM users INTO OUTFILE '/var/lib/mysql-files/users.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
解决中文乱码和表头缺失问题
导出文件本身是 UTF-8 编码,但 Windows Excel 默认用 GBK 打开,导致中文显示为乱码。两种实用解法:
- 用记事本打开 CSV → “另存为” → 编码选 UTF-8 with BOM → 再用 Excel 打开
- 在命令行导出时加 BOM 头:mysql -u user -p -e "SELECT ..." database | sed '1s/^/\xEF\xBB\xBF/' > local.csv
如需表头,INTO OUTFILE 不支持自动生成。可改用客户端方式拼接:
mysql -u user -p -D db_name -e "SELECT 'id','name','content' UNION ALL SELECT id,name,content FROM users" | sed 's/\t/,/g' > users_with_header.csv
没有 FILE 权限或用的是云数据库怎么办
阿里云 RDS、腾讯云 CDB 等通常禁用 FILE 权限,INTO OUTFILE 直接不可用。此时应切换到客户端导出:
- 用 mysql 命令 + shell 重定向(推荐):输出制表符分隔结果,再用 sed 替换为逗号
- 用图形工具(Navicat、DBeaver、phpMyAdmin):查完结果点“导出”,选 CSV 格式并勾选“包含列名”
- 避免 mysqldump:它导出的是 SQL 语句,不是纯数据 CSV
这类方式绕过服务端权限限制,全程在你本地完成,更可控也更通用。











