LOAD DATA INFILE/LOCAL INFILE 比循环 INSERT 快10倍以上,但需解决 secure_file_priv 限制、local_infile 开关、分隔符与转义配置、编码与BOM、字段对齐及截断预警等问题。

直接用 LOAD DATA INFILE 或 LOAD DATA LOCAL INFILE,别写循环 INSERT —— 速度差 10 倍以上,且容易卡死或超时。
为什么 LOAD DATA INFILE 报错 “The MySQL server is running with the --secure-file-priv option”?
这不是你路径写错了,是 MySQL 主动拦住了文件读取。它只允许从 secure_file_priv 指定目录读文件。
- 查当前限制:
SHOW VARIABLES LIKE 'secure_file_priv';—— 返回空值('')才能读任意路径;返回路径(如/var/lib/mysql-files/)就必须把 CSV 放进去 - 临时放开(仅开发环境):在
my.cnf(Linux)或my.ini(Windows)的[mysqld]段加secure_file_priv = "",然后重启 MySQL - 生产环境别清空该值,而是把 CSV 文件复制到返回的目录下再执行导入
LOAD DATA LOCAL INFILE 总提示 “The used command is not allowed” 怎么办?
这是服务端和客户端两头都没开 local_infile,不是权限问题,是开关没拨对。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- 服务端启用:
SET GLOBAL local_infile = ON;(需SUPER权限) - 客户端连接时必须显式开启:命令行加
--local-infile=1;Python 用pymysql.connect(..., local_infile=True);Java JDBC URL 加&allowLoadLocalInfile=true - 某些云数据库(如阿里云 RDS)默认禁用且不开放
SUPER权限,只能走LOAD DATA INFILE+ 上传文件到服务器指定目录
CSV 字段对不上、最后一列多出 \r、时间字段报错?全是分隔符和转义没配对
错误通常不是语法错,而是 MySQL 没切准字段边界,尤其 Windows 生成的 CSV 和含引号/换行的数据。
-
LINES TERMINATED BY:Linux/macOS 用'\n',Windows 记事本保存的用'\r\n';否则最后一列会带\r,导致类型转换失败 -
FIELDS TERMINATED BY ',' ENCLOSED BY '"'适用于标准 CSV;但如果字段里有未转义的逗号(如地址“北京市,朝阳区”),必须加OPTIONALLY ENCLOSED BY '"'并确保所有字段都用双引号包住 - 时间字段(如
"2024-03-15 14:22:08")不能直插:要用SET created_at = STR_TO_DATE(@created_at, '%Y-%m-%d %H:%i:%s')显式转换 - 跳过表头:加
IGNORE 1 LINES;但若 CSV 第一行不是纯字段名(比如含 BOM 或空格),先用 Notepad++ 转成 UTF-8 无 BOM 编码
导入后发现数据截断、警告一堆 “Row N was truncated”?
说明某行字段数 ≠ 表列数,或者某字段内容超长被静默截断 —— LOAD DATA 不报错,只给 warning,极易漏检。
- 先用
head -n 5 your.csv | cat -A(Linux)或 Notepad++ 显示所有字符,检查是否有隐藏换行、多余逗号、未闭合引号 - 建表时字段长度留足余量,比如
VARCHAR(255)比VARCHAR(50)更容错;数值型字段优先用DECIMAL而非INT防溢出 - 导入前加
SET sql_mode = 'STRICT_TRANS_TABLES';,让截断直接报错中断,而不是沉默丢数据 - 导入完立刻查:
SELECT COUNT(*) FROM your_table;和原始 CSV 行数比对;再查SHOW WARNINGS;看具体哪几行出了问题
真正麻烦的不是命令怎么写,而是 CSV 文件本身是否“干净”——有没有嵌套换行、BOM、混合编码、字段内未转义引号。这些在千万行里藏一个,LOAD DATA 就全盘失效,还不会告诉你在哪一行。建议先导 100 行做验证,再放大批量。

















