【问题标题】:postgreSQL COPY failing with value too long for type character varying(255)postgreSQL COPY 失败,类型字符变化的值太长(255)
【发布时间】:2021-06-22 19:49:13
【问题描述】:

我正在尝试复制一个 csv 文件,其中每一列都用双引号括起来。我使用的 COPY 语句是:

\COPY schema.table_name FROM 'file_name.csv' WITH (FORMAT CSV, DELIMITER ',', ESCAPE '\', QUOTE '"', FORCE_NULL(col1,col2,col3,col4))

“col3”列定义为 VARCHAR(255)。 csv 文件中的一行有一个字符串,该字符串的文字“\n”重复了 4 次,使字符串的长度为 259。我期望每次出现的 '\n' 都将转换为换行符,使字符串变为 255字符长。但是,COPY 语句失败并出现以下错误:

错误:类型字符变化的值太长(255)

COPY schema.table_name,第 11859 行,col3 列:“RN 推荐 3HX3D(周一、周三、周五)的 PCA/服务。\nincontinence 用品\nPERS new\nConsumer stat...”

当我将列长度更改为 260 时,COPY 工作正常。我无法更改列的长度,因为我不知道该列中可能包含多少个 '\n' 文字。这是 postgreSQL 中的错误吗?如果没有,如何解决?我正在使用 12.3 版的 postgreSQL。 提前致谢!

【问题讨论】:

  • 增加大小。在 Postgres 中没有大小的 varchar 是可以的。 [你必须来自 Oracle 或 mysql 世界?]
  • @wildplasser,感谢您的回复!更改列并删除大小后,COPY 工作得很好。
  • 我认为\n 在 CSV 格式中没有任何特殊含义,因此您可能需要对数据进行清理。

标签: postgresql


【解决方案1】:

@wildplasser 提供的答案很好用。我删除了 VARCHAR 列的大小,数据加载成功。

【讨论】:

    【解决方案2】:

    CSV 文件不使用 \ 转义(引号字符本身可能除外)。您可以通过让换行符按字面意思出现在文件中来转义换行符,但包含在引号内。因此,如果您使类型足够长以保存数据,它仍将保存 \ 和 n 的文字序列,而不是换行符。

    所以这不是 PostgreSQL 中的错误,而是文件数据中的错误。

    【讨论】:

    • 这值得商榷。我处理过许多包含转义序列的 csv 文件,包括 \n、\t 和 \r。但是当 postgreSQL 遇到转义序列时,它的行为是很奇怪的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2019-10-01
    • 2021-10-20
    • 2016-07-26
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多