使用MySQL LOAD DATA INFILE仅导入半数记录的问题求助
MySQL LOAD DATA导入CSV仅部分/无数据写入的解决方案(无需修改源文件)
先定位问题根源
首先需要明确CSV文件实际的换行符类型,不同系统生成的CSV换行符可能不一致(Unix/Linux用\n,Windows用\r\n,旧Mac用\r),甚至可能存在混合换行符的情况。
- 用
hexdump工具查看CSV文件的换行符十六进制:
查看输出中的换行标识:head -20 /x.csv | hexdump -C0a对应\n0d 0a对应\r\n0d对应\r
针对性调整LOAD DATA参数
根据检测到的换行符,修改LINES TERMINATED BY参数:
情况1:检测到混合换行符或\r
如果文件里同时存在\n和\r,或者单独是\r,尝试用'\r'作为行终止符:
LOAD DATA LOCAL INFILE '/x.csv' INTO TABLE Addresses FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r' IGNORE 1 ROWS;
情况2:编码不匹配导致换行符识别错误
CSV文件的编码(比如UTF-8带BOM、GBK等)可能干扰MySQL对换行符的识别,添加CHARACTER SET参数指定文件编码:
LOAD DATA LOCAL INFILE '/x.csv' INTO TABLE Addresses CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
(如果文件是GBK编码,替换为CHARACTER SET gbk)
排查数据截断/跳过的具体原因
即使命令执行无报错,也可能存在警告信息,导入后执行:
SHOW WARNINGS;
警告会明确显示问题,比如:
- 字段类型不匹配导致数据截断
- 行终止符识别错误导致列数不匹配
- 引号转义错误导致行拆分异常
替代方案:使用mysqlimport工具
如果LOAD DATA命令仍有问题,尝试用mysqlimport工具(本质和LOAD DATA一致,但参数格式更灵活):
mysqlimport --local \ --fields-terminated-by=',' \ --fields-optionally-enclosed-by='"' \ --fields-escaped-by='"' \ --lines-terminated-by='\n' \ --ignore-lines=1 \ 你的数据库名 /x.csv
根据之前检测的换行符,替换--lines-terminated-by的值为'\r'或'\r\n'。
内容的提问来源于stack exchange,提问作者user13849712
相关产品推荐
相关产品推荐

