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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:22:22