select into outfile是mysql原生最高效导出方式,数据由服务端直接写入服务器磁盘,但受限于secure_file_priv配置、服务器路径权限及字段格式设置,需显式指定fields terminated by和optionally enclosed by等参数生成合规csv。

用 SELECT ... INTO OUTFILE 直接导出到服务器文件系统
这是 MySQL 原生最高效的方式,但要求你有服务器写入权限且知道目标路径。它不走客户端,数据由 MySQL 服务端直接写入磁盘,速度快、无编码风险。
-
INTO OUTFILE只能写入 MySQL 服务所在机器的文件系统,不能写到你的本地电脑 - 目标目录必须被 MySQL 进程拥有写权限(常见路径如
/tmp或/var/lib/mysql-files/),且该路径需在secure_file_priv配置项允许范围内(运行SHOW VARIABLES LIKE 'secure_file_priv';查看) - 字段分隔符默认是
\t(制表符),要 CSV 必须显式指定:FIELDS TERMINATED BY ',';建议加上OPTIONALLY ENCLOSED BY '"'处理含逗号或换行的字段 - 示例语句:
SELECT id, name, email FROM users INTO OUTFILE '/tmp/users.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';
用 mysql 命令行工具加 --batch 和重定向导出到本地
适合没服务器写权限、或想直接保存到自己电脑的场景。本质是让客户端把查询结果按 tab 分隔输出,再用 shell 转成 CSV —— 简单但要注意字符编码和特殊字符。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- 必须加
--batch(或简写-B)关闭格式化表格输出,否则会混入横线、对齐空格 - 默认字段分隔符是 tab,可用
--tab选项生成带 tab 的文件,但更常用的是管道转 CSV:mysql -u user -p -e "SELECT ..." db | sed 's/\t/,/g' > users.csv - 中文乱码?加
--default-character-set=utf8mb4参数,确保终端和 MySQL 连接编码一致 - 字段含换行符或引号?
sed方案会崩。此时推荐用 Python 或 csvkit 工具做后处理,或改用mysqldump --tab(但同样受限于secure_file_priv)
Python + pandas.read_sql() 导出最稳妥的本地 CSV
当数据量不大、需要清洗或兼容复杂类型(如 JSON 字段、NULL、时间戳)时,用代码控制最灵活。pandas 自动处理引号、转义、编码,基本零踩坑。
- 连接串里务必指定
charset='utf8mb4'(MySQLdb)或encoding='utf8mb4'(PyMySQL),否则中文写入 CSV 可能变??? -
pd.read_sql()默认把NULL转成NaN,导出时 pandas 会自动写成空字符串,符合 CSV 常规;如需保留\N,得手动替换 - 导出时加参数:
df.to_csv('users.csv', index=False, encoding='utf-8-sig')——utf-8-sig是关键,能让 Excel 正确识别 UTF-8 中文 - 大表(百万行以上)注意内存:可改用
chunksize分批读取,再用mode='a'追加写入 CSV 文件
遇到 ERROR 1290 (HY000) 怎么办
这是最常卡住人的错误,提示类似 The MySQL server is running with the --secure-file-priv option...。不是权限问题,而是 MySQL 主动限制了文件操作路径。
- 先执行
SHOW VARIABLES LIKE 'secure_file_priv';,看返回值是NULL还是某个具体路径 - 如果是
NULL,说明INTO OUTFILE被完全禁用,只能换客户端导出方案(命令行或 Python) - 如果返回路径(如
/var/lib/mysql-files/),所有OUTFILE必须写到该目录下,且 MySQL 进程对该目录有写权限(chown mysql:mysql /var/lib/mysql-files) - 别试图修改
my.cnf去清空secure_file_priv—— 5.7+ 版本设为空值会被忽略,设为''则启动失败
INTO OUTFILE 前一定先查 secure_file_priv;用命令行记得加 --batch 和字符集;用 Python 就别省掉 utf-8-sig。










