PostgreSQL导入CSV文件被截断仅导入65535行的原因及解决办法
问题原因
- CSV文件导出环节截断:使用旧版Excel(支持.xls格式版本)导出CSV时,单工作表最大行数限制为65536行,去除表头后刚好为65535行数据,导出时就已经丢失了超出部分。
- 文件含异常结束符:CSV文件中被错误插入了EOF(ASCII 0x1A)结束符,PostgreSQL的COPY命令读取到该字符时会判定文件已结束,刚好停在65535行位置。
- 目标表字段类型超限:如果表的主键、唯一键等非空字段使用了16位整数类型(如无符号
smallint),其最大值为65535,插入第65536行时触发类型上限错误,导入隐性中断。 - 第三方工具限制:通过老版本phpPgAdmin、Navicat试用版等第三方管理工具执行导入时,部分工具对单次导入行数设置了65535的上限,自动截断超出部分。
- 导入触发隐性报错:第65536行存在格式错误(如字段数不匹配、类型转换失败),当前会话未开启错误打印,导入静默中断。
修复方案
验证CSV文件完整性
优先确认原始CSV行数符合预期,Linux/Mac执行命令:wc -l 你的CSV文件路径
Windows PowerShell执行命令:(Get-Content 你的CSV文件路径 | Measure-Object -Line).Lines
如果确认是导出环节截断,不要使用旧版Excel中转CSV,直接从业务系统导出完整CSV,或使用支持xlsx格式的Excel重新导出。移除文件异常结束符
Linux/Mac执行命令清除EOF字符:sed -i 's/\x1A//g' 你的CSV文件路径
Windows可使用Notepad++打开文件,开启「视图-显示符号-显示所有字符」,手动删除识别到的EOF符号,或执行PowerShell命令:(Get-Content 你的CSV文件路径 -Raw) -replace "x1A", "" | Set-Content 新的CSV文件路径`调整目标表字段类型
执行SQL查看表结构确认字段类型:
\d+ 你的表名
如果存在使用smallint的非空自增字段,修改为上限更高的整数类型:
ALTER TABLE 你的表名 ALTER COLUMN 字段名 TYPE integer;
- 使用命令行执行导入并开启错误捕获
建议直接使用psql命令行执行COPY命令,绕过第三方工具限制,同时增加错误日志配置避免静默中断:
-- 提前创建错误日志表,用于存储导入失败的行数据 CREATE TABLE 导入错误日志 (LIKE 你的表名, 错误信息 text, 错误发生时间 timestamp); COPY 你的表名(字段列表) FROM '你的CSV文件绝对路径' DELIMITER ',' CSV HEADER LOG ERRORS INTO 导入错误日志 SEGMENT REJECT LIMIT UNLIMITED;
导入完成后执行SELECT COUNT(*) FROM 你的表名确认导入行数,同时可查询导入错误日志表处理异常数据。
内容的提问来源于stack exchange,提问作者sheanshar
相关产品推荐
相关产品推荐

