使用JDBC将CSV导入PostgreSQL自定义类型数组时报错求助
问题根源与解决方案
这个错误的核心原因是PostgreSQL的CSV解析器会将自定义类型和数组中的逗号误判为字段分隔符,导致原本完整的数组值被拆分成不完整的片段,触发"malformed record literal"异常。
最直接的解决方案:改用TEXT格式导入
PostgreSQL的TEXT格式原生支持其自定义类型、数组的字符串表示,不需要额外处理符号冲突。修改你的COPY命令如下:
String copyCommand = "COPY my_table (addresses) " + "FROM STDIN WITH (" + "DELIMITER '\t', " + "FORMAT text, " + "NULL '\\N')";
这样你的原始输入格式({(10.10.10.1,80),(10.10.10.2,443)} {(10.10.10.3,8080),(10.10.10.4,4040)})就能被正确解析——因为制表符分隔的每个值都会被直接当作address[]类型的原生文本表示处理,不会拆分内部的逗号。
如果你坚持使用CSV格式的替代方案
如果必须保留CSV格式,你需要将每个数组值用双引号完全包裹,避免内部的逗号被解析为字段分隔符。调整你的输入内容为:
"{(10.10.10.1,80),(10.10.10.2,443)}" "{(10.10.10.3,8080),(10.10.10.4,4040)}"
同时确保你的COPY命令中的QUOTE和ESCAPE参数正确(你当前的设置已经没问题),这样CSV解析器会把引号内的内容当作一个完整的字段值处理,不会拆分内部的符号。
额外注意点
- 你的表
my_table只有addresses一个字段,所以每行的制表符分隔值会对应一条记录的addresses字段。如果你的输入是想导入两条记录,也可以将每个数组值单独放在一行,不需要制表符分隔,这样更直观。 - 自定义类型
address的文本格式(ip, port)是PostgreSQL原生支持的,不需要额外转换,只要外层的数组格式{...}正确即可。
内容的提问来源于stack exchange,提问作者Swaranga Sarma
相关产品推荐
相关产品推荐

