php用fgetcsv()读csv中文乱码的根本原因是文件编码(如gbk)与php按字节解析冲突;应转为utf-8无bom,或改用str_getcsv()、league/csv等更健壮方案。

PHP 用 fgetcsv() 读 CSV 时中文乱码怎么办
根本原因不是 PHP 不支持中文,而是 CSV 文件本身编码和 PHP 读取时的字节流处理不匹配。Windows 记事本默认保存为 GBK/GB2312,而 fgetcsv() 按字节切分字段,遇到双字节中文直接截断,后续解析全错。
- 先用
mb_detect_encoding(file_get_contents($file), ['UTF-8', 'GBK', 'BIG5'], true)粗略判断源文件编码(注意:不能完全信赖,仅作参考) - 更可靠的做法是强制转码:用
iconv('GBK', 'UTF-8//IGNORE', file_get_contents($file))生成临时 UTF-8 内容,再用str_getcsv()或写入临时文件后fgetcsv() - 如果必须用
fgetcsv()直读,确保文件是 UTF-8 无 BOM —— 用 VS Code、Notepad++ 显式另存为 “UTF-8”(不是“UTF-8 with BOM”)
用 LOAD DATA INFILE 快速入库,但提示 ERROR 1290 (HY000)
这是 MySQL 服务端禁用了本地文件加载,和 PHP 代码无关,属于权限与配置问题。
- 检查 MySQL 配置:
SHOW VARIABLES LIKE 'local_infile';返回OFF就必须开 —— 启动 mysqld 时加--local-infile=1,或在my.cnf的[mysqld]和[client]下都加上local_infile = 1 - PHP 连接时也要显式启用:
mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true);,PDO 则需在 DSN 中加;local_infile=1,且构造 PDO 时传[PDO::MYSQL_ATTR_LOCAL_INFILE => true] -
LOAD DATA INFILE要求文件路径是 MySQL 服务端可访问的绝对路径,LOAD DATA LOCAL INFILE才走客户端路径 —— 但很多托管环境(如 cPanel、阿里云 RDS)直接禁用LOCAL版本
逐行 fgetcsv() + INSERT 入库太慢,怎么提速
瓶颈不在 CSV 解析,而在单条 INSERT 的网络往返和事务开销。每行一次查询,1 万行就是 1 万次 round-trip。
m18麦考林整站 for Ecshop v2.7.3 安装方法: 1,解压rar包上传到网站根目录 2,导入sql数据库文件,到你的数据库里,可以phpmyadmin等软件 3,修改data里config.php里面的数据库 用户名 密码等信息 为你自己的数据库信息 4,安装完毕之后的后台用户名密码为: 后台地址:域名/admin 用户名:admin 密码:admin123 模板使用教程: htt
- 把多行数据攒成一批,拼成单条
INSERT INTO t VALUES (...), (...), (...)—— 注意单次语句别超max_allowed_packet(默认 4MB,可查SHOW VARIABLES LIKE 'max_allowed_packet';) - 入库前用
START TRANSACTION包裹整批,最后COMMIT;否则每条 INSERT 自动提交,日志写入压力翻倍 - 临时关掉非必要索引:
ALTER TABLE t DISABLE KEYS;,导入完再ENABLE KEYS;(仅对 MyISAM 有效;InnoDB 用innodb_buffer_pool_size和批量提交更关键)
CSV 字段含换行符、逗号、双引号,fgetcsv() 解析错位
fgetcsv() 本身支持标准 CSV 规范(RFC 4180),但前提是文件严格遵循:字段用双引号包裹,内部双引号转义为两个双引号,换行符保留在引号内。很多导出工具(尤其是 Excel)输出不规范。
立即学习“PHP免费学习笔记(深入)”;
- 调用时务必指定正确的封装符和转义符:
fgetcsv($fp, 0, ',', '"', '"')—— 第 4、5 参数分别表示 enclosure 和 escape,PHP 8.1+ 默认 escape 是"\0",旧版默认"\"",不一致就会崩 - 如果原始 CSV 来自 Excel 且含真实换行,优先改用
str_getcsv()配合file()读整行,自己按引号状态做状态机解析(简单场景够用) - 终极方案:改用
league/csv库,它内置了 RFC 兼容解析器和错误恢复机制,比如跳过损坏行、自动检测 BOM、支持流式处理
最常被忽略的是 CSV 源头质量 —— 很多“解析失败”实际是 Excel 导出时用了分号当分隔符、或手动改过内容却没重置引号。建议入库前先用 head -n 5 your.csv | cat -A 看真实字符,比猜编码和分隔符靠谱得多。










