LOAD DATA LOCAL INFILE导入CSV文件服务器端返回空数组怎么办
排查解决步骤
- 第一步:检查MySQL
local_infile配置与PHP连接参数
服务器MySQL默认会关闭本地文件加载权限,先执行SQL查询配置:
如果结果为SHOW GLOBAL VARIABLES LIKE 'local_infile';OFF,执行开启命令:
同时要确认你的PDO连接参数里开启了本地文件加载权限,连接时需要添加参数:SET GLOBAL local_infile = 1;
如果配置后仍不生效,检查php.ini中$con = new PDO($dsn, $user, $pass, [ PDO::MYSQL_ATTR_LOCAL_INFILE => true, // 其他原有参数 ]);pdo_mysql.allow_local_infile是否设置为On。 - 第二步:验证CSV文件的路径与权限
你代码中使用的是相对路径customers.csv,先确认:- 该文件确实存放在PHP代码执行的当前工作目录下,可输出
realpath("customers.csv")确认路径是否正确 - 运行PHP进程的用户(常见为www-data、apache、nginx用户)拥有该文件的读取权限,可补充
is_readable("customers.csv")判断可读性,不要只判断file_exists,也可以临时执行chmod a+r customers.csv授予全局读权限测试是否为权限问题。
- 该文件确实存放在PHP代码执行的当前工作目录下,可输出
- 第三步:调整换行符匹配规则
你当前配置的是LINES TERMINATED BY '\n',如果CSV文件是Windows环境生成的,默认换行符为\r\n,Linux服务器无法正常识别,可修改为:
如果CSV存在表头行,还要补充LINES TERMINATED BY '\r\n'IGNORE 1 ROWS忽略表头,避免表头作为数据行插入异常。 - 第四步:捕获执行错误与警告
你现有代码没有捕获执行过程中的错误和警告,可在LOAD DATA语句执行完成后,执行SQL查询警告信息:
同时查看PHP错误日志、MySQL错误日志,确认是否存在文件读取失败、权限不足、字段不匹配等报错。SHOW WARNINGS; - 第五步:替换临时表测试
可先将临时表替换为普通物理表测试导入效果,排除临时表生命周期、连接复用导致的临时表失效问题。 - 第六步:验证文件编码
确认CSV文件编码和数据库表编码一致,若CSV为GBK/GB2312编码,数据库为UTF-8编码会导致插入失败,可将CSV转码为UTF-8后再测试。
内容的提问来源于stack exchange,提问作者Ahmad Mardini
相关产品推荐
相关产品推荐

