使用LOAD DATA LOCAL INFILE导入数据时遇MySQL 1148(42000)错误求助
看起来你遇到了两个核心问题:SQL语句的语法错误,以及LOCAL INFILE的权限/配置问题导致的Error 1148。咱们一步步来解决:
1. 先修复LOAD DATA语句的语法错误
你的语句里SET cmj = REPLACE(@cmj,',','.');存在问题——你引用了@cmj变量,但在前面的字段列表里没有定义这个变量。要对CSV中的某列做替换后存入表字段,需要先把对应CSV列读取到一个临时变量,再通过SET子句处理赋值。
举个例子:如果cmj是你的目标表字段,且它对应CSV中的第5列,那么修正后的语句应该是:
LOAD DATA LOCAL INFILE '/绝对路径/f.csv' -- 建议用绝对路径避免相对路径问题 INTO TABLE tableName FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (C1, C2, C3, C4, @cmj_raw) -- 将CSV第5列读入临时变量@cmj_raw SET cmj = REPLACE(@cmj_raw, ',', '.'); -- 替换后赋值给表的cmj字段
如果cmj对应的是CSV中已有的某个列(比如C4),那你需要调整字段列表,把C4读入变量再处理:
LOAD DATA LOCAL INFILE '/绝对路径/f.csv' INTO TABLE tableName FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (C1, C2, C3, @cmj_raw) SET C4 = REPLACE(@cmj_raw, ',', '.');
2. 解决Error 1148 (42000) 问题
这个错误的本质是服务器不允许使用LOCAL INFILE命令,即使你修改了my.cnf,可能还有几个环节没配置到位:
步骤1:确认my.cnf配置生效
先重启MySQL服务让配置生效:
sudo service mysql restart
登录MySQL后,执行以下命令检查全局变量:
SHOW GLOBAL VARIABLES LIKE 'local_infile';
如果结果不是ON,说明你的my.cnf配置可能没被正确读取(Ubuntu 14.04的MySQL 5.7通常使用/etc/mysql/mysql.conf.d/mysqld.cnf作为配置文件,你可以确认下路径是否正确)。
步骤2:客户端连接时显式开启local-infile
即使服务器端开了local_infile,客户端连接时也需要显式启用这个选项。登录MySQL时用以下命令:
mysql --local-infile=1 -u 你的用户名 -p
如果是用程序(比如PHP/Python)连接,需要在连接参数中开启LOCAL INFILE支持:
- PDO示例:
new PDO('mysql:host=localhost;dbname=你的数据库', '用户名', '密码', [PDO::MYSQL_ATTR_LOCAL_INFILE => true]);
步骤3:确保用户拥有FILE权限
执行LOAD DATA LOCAL INFILE需要用户具备FILE权限,给你的用户授权:
GRANT FILE ON *.* TO '你的用户名'@'localhost'; FLUSH PRIVILEGES;
步骤4:检查文件权限
确保MySQL客户端(执行命令的用户)能读取f.csv文件,建议使用绝对路径,并且文件权限至少设置为644:
chmod 644 /你的文件路径/f.csv
按以上步骤操作后,应该就能成功执行LOAD DATA语句了。
内容的提问来源于stack exchange,提问作者MEKI

