You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 08:57:51