LOAD DATA INFILE 报错 ERROR 1290 是因服务端未启用 local_infile 且客户端未声明支持;路径必须为服务端绝对路径,文件需 MySQL 进程用户可读;格式须显式指定字段分隔符、引号及行终止符,并确保 UTF-8 无 BOM;云数据库禁用时可用 mysqlimport 或批量 INSERT 替代。

LOAD DATA INFILE 为什么本地文件总报错 ERROR 1290 (HY000)
MySQL 默认禁用本地文件导入,这是安全限制,不是配置写错了。服务端必须显式开启 local_infile,且客户端连接时也得主动声明支持——两边缺一不可。
- 服务端:启动 mysqld 时加
--local-infile=1,或在my.cnf的[mysqld]段下加local_infile=1,然后重启 - 客户端:用
mysql --local-infile=1 -u root -p连接;如果用 Python 的pymysql,初始化连接时要传local_infile=True - 注意:
SHOW VARIABLES LIKE 'local_infile';查的是服务端值,SELECT @@local_infile;查的是当前会话是否生效(依赖客户端连接参数)
LOAD DATA INFILE 路径到底该写服务器路径还是本地路径
它只认 MySQL 服务进程能直接访问的**服务器端绝对路径**,不是你电脑上双击打开的那个 CSV。所谓“本地文件”只是误导词,实际是“服务端本地”。想导自己电脑上的文件,必须先 scp 或 FTP 传到数据库服务器上。
- 正确写法:
LOAD DATA INFILE '/var/tmp/data.csv' INTO TABLE users; - 错误写法:
LOAD DATA INFILE 'C:\Users\Me\data.csv'(Windows 本地路径)、./data.csv(相对路径,服务端找不到) - 路径权限:MySQL 进程用户(如
mysql)必须有读取该文件的权限,常见坑是文件属主为root但mysql用户无法读
字段分隔符和空行处理不匹配导致数据错位
CSV 不等于 CSV,Excel 导出、Python csv.writer、Linux awk 生成的格式常有差异,LOAD DATA INFILE 对格式极其敏感,一个引号或换行符不对就整行失效。
- 最稳妥:用
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'显式声明,别依赖默认 - 跳过首行(含标题):加上
IGNORE 1 ROWS - 空行或尾部换行符多余:会导致最后一行被识别为“空记录”,建议用
sed -i '$d' data.csv删除文件末尾空行 - 中文乱码:确保文件是 UTF-8 无 BOM,SQL 里加
CHARACTER SET utf8mb4
替代方案:当 LOAD DATA INFILE 不能用时怎么批量导入
很多云数据库(如阿里云 RDS、AWS RDS)干脆禁用了 LOAD DATA INFILE,连服务端开关都不给你开。这时候别硬刚,换更可控的方式。
- 用
mysqlimport命令:它是LOAD DATA INFILE的命令行封装,同样走服务端路径,但对权限提示更明确 - 拆成 INSERT 批量语句:用脚本把 CSV 转成
INSERT INTO t VALUES (),(),();,每 1000 行一提交,避免单条 SQL 过大 - Python +
executemany():比逐条execute()快 10 倍以上,注意设置cursor.arraysize = 1000和事务手动控制
真正卡住的往往不是语法,而是路径归属、字符编码、权限三者交叉验证没做全。跑之前先 ls -l 看文件、mysql -e "SELECT @@version;" 确认版本、head -n3 data.csv 看真实内容——这三步省掉,后面全是玄学错误。

















