导入CSV文件到现有MySQL数据库报1045权限错误如何解决
问题根因
你遇到的1045报错不是普通的登录权限问题,是执行LOAD DATA INFILE语句需要额外的全局FILE权限。平时常用的查询、增删改操作只需要单库级别的权限即可,FILE属于全局级别的特殊权限,默认不会给普通用户开通,这就是为什么普通PHP脚本和phpMyAdmin能正常使用,唯独导入CSV会报错的核心原因。
另外phpMyAdmin导入CSV时默认使用LOAD DATA LOCAL INFILE模式,不需要FILE权限,所以能正常运行。
解决方案
方案1:申请开通FILE权限(不推荐)
联系主机商给你的数据库用户授予全局FILE权限,同时确认secure_file_priv配置允许读取你存放CSV的目录即可。但绝大多数共享主机不会开放这个权限,安全风险较高。
方案2:改用LOAD DATA LOCAL INFILE模式(推荐,和phpMyAdmin逻辑一致)
不需要额外权限,只要调整你的语句和命令参数即可:
对应PHP脚本修改
<?php // 连接时开启LOCAL INFILE选项 $con = mysqli_init(); mysqli_options($con, MYSQLI_OPT_LOCAL_INFILE, true); mysqli_real_connect($con, "hostname", "username", "password", "database"); $sql = "LOAD DATA LOCAL INFILE '/home/dir/dir2/file.csv' INTO TABLE `Table` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r' (col1, col2, col3, etc.)"; $result = mysqli_query($con, $sql); mysqli_close($con); ?>
对应mysql命令修改
mysql -hhostname -uusername -ppassword --local-infile=1 database -e "LOAD DATA LOCAL INFILE '/绝对路径/to/file.csv' INTO TABLE `Table` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'"
注意要填写CSV文件的绝对路径,避免执行时找不到文件。
对应mysqlimport命令修改
mysqlimport -hhostname -uusername -ppassword --local --fields-terminated-by=',' --lines-terminated-by='\n' database /绝对路径/to/file.csv
额外注意事项
- 表名如果是MySQL关键字(比如示例中的
Table)一定要用反引号包裹,避免触发语法错误 - 确认CSV文件的行尾换行符和你语句里写的一致,Linux下一般是
\n,Windows导出的是\r\n,可以用cat -A file.csv查看行尾标识 - 如果cron执行时提示文件找不到,统一替换为CSV的绝对路径即可解决
内容的提问来源于stack exchange,提问作者Arkyyn
相关产品推荐
相关产品推荐

