从CSV文件导入数据库时的UTF-8编码问题
解决LOAD DATA INFILE导入CSV的1262警告与部分数据导入问题
我帮你梳理下问题根源,结合你提供的SQL语句和CSV示例,主要问题集中在行终止符不匹配、转义字符缺失以及编码兼容性这几个方面,咱们一步步解决:
一、核心问题分析
你提到phpMyAdmin能完整导入,但LOAD DATA只导入88行还报1262警告,原因在于:
- phpMyAdmin会自动识别CSV的换行格式和转义规则,但LOAD DATA需要明确配置这些参数;
- 你的CSV里包含法语重音字符(é、à),MySQL的
utf8是3字节编码,无法兼容全部Unicode字符,可能导致隐性截断; - 部分行可能存在未转义的双引号,导致字段分割错误,触发“数据列数不匹配”的截断警告。
二、分步解决方案
1. 修正LOAD DATA的关键参数
修改导入语句,补充转义规则并匹配正确的行终止符(Windows CSV通常用\r\n换行):
LOAD DATA LOCAL INFILE 'C:/data.csv' INTO TABLE import CHARACTER SET utf8mb4 FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '"' -- 处理CSV中用双引号转义双引号的情况(比如"内容里的""引号"") LINES TERMINATED BY '\r\n' IGNORE 1 ROWS;
这里的ESCAPED BY '"'是关键——如果CSV字段内包含双引号,标准格式是用两个双引号转义,这个参数告诉MySQL正确解析这类内容,避免提前截断字段。
2. 升级表编码到utf8mb4
把表的字符集换成utf8mb4,它支持全部Unicode字符,完美兼容法语重音,同时避免乱码:
CREATE TABLE IF NOT EXISTS `import` ( `AnnonceurCodeListe` varchar(4) DEFAULT NULL, `AnnonceurSocieteNom` varchar(20) DEFAULT NULL, `AnnonceurSocieteMarque` varchar(10) DEFAULT NULL, `AnnonceurSocieteAdresse` varchar(37) DEFAULT NULL, `AnnonceurSocieteAdresseSuite` varchar(10) DEFAULT NULL, `AnnonceurSocieteCodePostal` varchar(5) DEFAULT NULL, -- 建议改成varchar,避免丢失邮编前导零 `AnnonceurSocieteVille` varchar(6) DEFAULT NULL, `AnnonceurContactsNoms` varchar(17) DEFAULT NULL, `AnnonceurContactsTelephones` varchar(14) DEFAULT NULL, `AnnonceurContactsTelephones2` varchar(15) DEFAULT NULL, `AnnonceurContactsEmails` varchar(18) DEFAULT NULL, `VehiculeIdentifiantVehicule` int(8) DEFAULT NULL, `VehiculeReferenceVehicule` int(4) DEFAULT NULL, `VehiculeNumeroPolice` int(4) DEFAULT NULL, `VehiculeStatutStock` varchar(2) DEFAULT NULL, `VehiculeAnnee` int(4) DEFAULT NULL, `VehiculeDate1Mec` DATE DEFAULT NULL, -- 建议改成DATE类型,后续可以用STR_TO_DATE转换 `VehiculeGenreLibelle` varchar(18) DEFAULT NULL, `VehiculeMarque` varchar(10) DEFAULT NULL, `VehiculeFamille` varchar(14) DEFAULT NULL, `VehiculeVersion` varchar(51) DEFAULT NULL, `VehiculeModele` varchar(63) DEFAULT NULL, `VehiculeTypeMine` varchar(15) DEFAULT NULL, `VehiculeEnergieLibelle` varchar(10) DEFAULT NULL, `VehiculePuissanceFiscale` int(2) DEFAULT NULL, `VehiculePuissanceReelle` int(3) DEFAULT NULL, `VehiculeCylindree` int(4) DEFAULT NULL, `VehiculeNbPlaces` int(1) DEFAULT NULL, `VehiculeNbPortes` int(1) DEFAULT NULL, `VehiculeKilometrage` int(6) DEFAULT NULL, `VehiculeKmGaranti` varchar(11) DEFAULT NULL, `VehiculeCouleur` varchar(10) DEFAULT NULL, `VehiculeBoiteLibelle` varchar(17) DEFAULT NULL, `VehiculeNbRapports` int(1) DEFAULT NULL, `VehiculePrixVenteTTC` int(5) DEFAULT NULL, `VehiculePremiereMain` varchar(4) DEFAULT NULL, `VehiculeGarantieLibelle` varchar(30) DEFAULT NULL, `VehiculeDestinationLibelle` varchar(10) DEFAULT NULL, `VehiculeCategorieLibelle` varchar(17) DEFAULT NULL, `VehiculeEquipementsSerie` varchar(254) DEFAULT NULL, `VehiculeEquipementsOption` varchar(254) DEFAULT NULL, `VehiculeSiteLibelle` varchar(15) DEFAULT NULL, `VehiculePhotos` varchar(189) DEFAULT NULL, `VehiculeCo2` int(3) DEFAULT NULL, `VehiculeCommentairePublic` varchar(10) DEFAULT NULL ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注意:我把AnnonceurSocieteCodePostal改成了varchar(5)——法国邮编可能带前导零(比如06000),用int会丢失前导零,导致数据不准确;VehiculeDate1Mec改成了DATE类型,后续可以用日期函数处理。
3. 优化日期字段导入(可选)
如果把VehiculeDate1Mec改成了DATE类型,需要在导入时转换格式:
LOAD DATA LOCAL INFILE 'C:/data.csv' INTO TABLE import CHARACTER SET utf8mb4 FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 ROWS ( AnnonceurCodeListe, AnnonceurSocieteNom, AnnonceurSocieteMarque, AnnonceurSocieteAdresse, AnnonceurSocieteAdresseSuite, AnnonceurSocieteCodePostal, AnnonceurSocieteVille, AnnonceurContactsNoms, AnnonceurContactsTelephones, AnnonceurContactsTelephones2, AnnonceurContactsEmails, VehiculeIdentifiantVehicule, VehiculeReferenceVehicule, VehiculeNumeroPolice, VehiculeStatutStock, VehiculeAnnee, @VehiculeDate1Mec, VehiculeGenreLibelle, VehiculeMarque, VehiculeFamille, VehiculeVersion, VehiculeModele, VehiculeTypeMine, VehiculeEnergieLibelle, VehiculePuissanceFiscale, VehiculePuissanceReelle, VehiculeCylindree, VehiculeNbPlaces, VehiculeNbPortes, VehiculeKilometrage, VehiculeKmGaranti, VehiculeCouleur, VehiculeBoiteLibelle, VehiculeNbRapports, VehiculePrixVenteTTC, VehiculePremiereMain, VehiculeGarantieLibelle, VehiculeDestinationLibelle, VehiculeCategorieLibelle, VehiculeEquipementsSerie, VehiculeEquipementsOption, VehiculeSiteLibelle, VehiculePhotos, VehiculeCo2, VehiculeCommentairePublic ) SET VehiculeDate1Mec = STR_TO_DATE(@VehiculeDate1Mec, '%d-%m-%Y');
4. 排查剩余问题
如果还是有警告,执行导入后运行SHOW WARNINGS;,它会显示具体哪一行、哪个字段出了问题,方便你针对性修复CSV数据(比如未转义的双引号、字段数不匹配等)。
三、额外提示
- 导入前先备份表数据,避免测试过程中丢失数据;
- 可以先导入前10行测试,确认参数正确后再导入全部数据;
- 如果CSV是Linux/Mac生成的,把
LINES TERMINATED BY '\r\n'改成LINES TERMINATED BY '\n'即可。
内容的提问来源于stack exchange,提问作者Xullien
相关产品推荐
相关产品推荐

