PostgreSQL导入数据遇长度报错及导入行数异常问题排查
PostgreSQL COPY导入问题排查
问题1:varchar(512)导入报错且行号不符
value too long for type character varying(512)错误的直接原因是plabel字段的实际内容字符数超过了512的限制(varchar(n) 限制的是字符数量,而非字节数)。
报错行与实际行不符的核心原因是源文件存在未正确转义的换行字段:COPY默认以换行符识别行,但如果字段内容包含未被引号包裹的换行,PostgreSQL会将多行物理行解析为单个逻辑行,报错时显示的是逻辑行号,自然和源文件的物理行号不匹配。
问题2:改为text后导入行数远少于源文件但无报错
这种情况几乎都是源文件格式与COPY默认解析规则不匹配导致的,常见场景:
- 字段分隔符不匹配:比如源文件用制表符分隔,但COPY默认用逗号,导致多字段被合并为一个,后续行被当作当前字段的内容,最终逻辑行数远少于物理行数。
- 引号未成对闭合:CSV格式中部分字段的引号没有正确闭合,COPY会将后续所有行视为当前字段的内容,直到找到下一个匹配的引号,直接导致大量物理行被合并为少数逻辑行。
- 换行符格式不兼容:源文件用Windows风格的
\r\n换行,而Linux环境下COPY默认只识别\n,\r被当作字段内容的一部分,造成行错误合并。
验证与解决方法:
- 用
wc -l /tmp/2019q4/pre.txt确认源文件物理行数 - 查看第275079行之后的内容(
head -n 275080 /tmp/2019q4/pre.txt | tail -n 10),检查是否存在引号未闭合或格式异常 - 明确指定COPY参数重新导入,比如:
COPY pre FROM '/tmp/2019q4/pre.txt' WITH ( FORMAT csv, DELIMITER '\t', -- 根据实际分隔符调整 QUOTE '"', ESCAPE '"', NEWLINE 'CRLF' -- 如果是Windows换行则添加 );
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

