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

PostgreSQL COPY命令处理转义分隔符报错问题求助

含转义逗号的CSV导入PostgreSQL报错的解决方法

问题背景

  • 用Java程序导入8GB左右的CSV到PostgreSQL,部分行包含转义逗号\,,逗号同时作为字段分隔符。
  • MySQL使用对应命令可正常导入,但PostgreSQL触发报错:org.postgresql.util.PSQLException: ERROR: extra data after last expected column。

相关命令与代码

原PostgreSQL COPY命令

"COPY temporary_%s (%s) FROM STDIN with csv";

对比可用的MySQL命令

"LOAD DATA LOCAL INFILE ? "
          + "INTO TABLE temporary_%s "
          + "FIELDS TERMINATED BY ',' ENCLOSED BY '\"' "
          + "LINES TERMINATED BY '\n' "
          + "(%s)";

Java导入代码片段

BaseConnection physicalConnection =
    (BaseConnection) connection.unwrap(Class.forName("org.postgresql.core.BaseConnection"));

CopyManager copyManager = new CopyManager(physicalConnection);
FileReader fileReader = new FileReader(fileName);
copyManager.copyIn(String.format(PROCEDURE_POSTGRES, tableName, columns), fileReader);

问题数据示例

0.2\,4,000088797e02a729c72ff07bb9c5a84ef27e6b7c,1541592473000,1545585645000,0.3.0,1,NULL,NULL

期望第一列导入后为0.2,4。

完整报错信息

2025-02-04 12:00:40 2025-02-04 17:00:40.374 UTC [89725] STATEMENT:  COPY table_name (***, ***, ***, ***, ***, ***, ***, ***, ***) FROM STDIN with csv"
2025-02-04 12:03:48 2025-02-04 17:03:48.733 UTC [89890] ERROR:  extra data after last expected column
2025-02-04 12:03:48 2025-02-04 17:03:48.733 UTC [89890] CONTEXT:  COPY table_name, line 10: "  0.2\,4,000088797e02a729c72ff07bb9c5a84ef27e6b7c,1541592473000,1..."

解决方案

去掉csv选项,改用指定分隔符的普通文本模式,修改后的COPY命令如下:

"COPY temporary_%s (%s) FROM STDIN DELIMITER ','";

原因说明

PostgreSQL的COPY ... WITH CSV模式严格遵循RFC 4180标准,仅允许双引号包裹的字段内出现逗号,不支持反斜杠转义逗号。而MySQL的LOAD DATA默认支持反斜杠转义规则,因此能正确解析转义后的逗号。改用无csv选项的模式后,PostgreSQL会按指定分隔符处理数据,同时识别反斜杠为转义字符,从而将0.2\,4正确解析为单个字段的0.2,4。

内容的提问来源于stack exchange,提问作者b12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:15:02