select into outfile 只能写入mysql服务器磁盘且受secure_file_priv严格限制;若该变量为null则功能禁用,非空路径须精确匹配,还需file权限及文件系统写权限,导出csv需转义双引号并统一enclosed by '"'以兼容excel。

SELECT INTO OUTFILE 不能直接导出到你本地电脑,它只写入 MySQL 服务器磁盘,且默认受 --secure-file-priv 限制 —— 这是绝大多数人执行失败的根源。
为什么 SELECT INTO OUTFILE 总报错 ERROR 1290?
最常见原因是 MySQL 启用了 --secure-file-priv 安全选项,它强制限定只能往指定目录写文件(比如 /var/lib/mysql-files/ 或 /tmp/),连 /tmp/result.csv 都可能被拒绝。
- 查当前允许路径:
SHOW VARIABLES LIKE 'secure_file_priv'; - 如果返回
NULL,说明该功能被完全禁用,SELECT INTO OUTFILE根本不可用 - 如果返回空字符串(
''),表示未设限制(极少见,不推荐) - 路径不是你随便写的 —— 必须严格匹配返回值,例如返回
/var/lib/mysql-files/,你就只能写INTO OUTFILE '/var/lib/mysql-files/output.csv' - 该路径需同时满足:MySQL 进程有写权限 + 文件名不能已存在
导出 CSV 给 Excel 用,字段含逗号或换行怎么办?
不处理双引号和内部换行,Excel 打开后会列错位、多出空行。关键不是加 ENCLOSED BY '"',而是得提前转义字段里的 "。
- 字符串字段必须用
REPLACE(col, '"', '""')替换双引号,否则 CSV 解析器会误判字段边界 -
LINES TERMINATED BY '\r\n'比'\n'更兼容 Windows Excel - 不要用
OPTIONALLY ENCLOSED BY—— 它对数字字段不加引号,但 Excel 有时会把带前导零的数字(如"00123")自动转成123,应统一用ENCLOSED BY '"' - 示例语句:
SELECT REPLACE(name, '"', '""'), REPLACE(desc, '"', '""') INTO OUTFILE '/var/lib/mysql-files/export.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' FROM t;
没 FILE 权限或 secure-file-priv 锁死时,怎么绕过?
这时候 SELECT INTO OUTFILE 已失效,得换客户端侧导出方式,本质是让 mysql 命令行把结果重定向到本地文件。
- 终端执行:
mysql -u user -p -e "SELECT * FROM db.table" db_name > output.csv—— 注意:无INTO OUTFILE,靠 shell 的>重定向 - Windows 下若中文乱码,加
--default-character-set=utf8mb4参数 - 想导出带列头?加
-X(XML)或-s -N(tab 分隔无头),但 CSV 头部需自己拼:echo "id,name,age" > output.csv && mysql -u... -s -N -e "SELECT id,name,age FROM t" >> output.csv - 注意:这种方式不经过 MySQL 服务端文件系统,不受
secure-file-priv和 FILE 权限限制
真正麻烦的不是语法,而是搞清数据最终落在哪台机器、谁有权限读写那个路径、以及 Excel 实际认哪种换行和引号规则 —— 这三处任一出错,导出的文件就“看起来没问题,打开却错乱”。










