PostgreSQL使用COPY导入CSV时JSONB字段报错,如何解决?
修复PostgreSQL COPY导入JSONB字段的错误
问题根源
你的COPY命令指定了QUOTE '"'(双引号)和ESCAPE ''''(单引号),但CSV中JSON字段的双引号未按当前参数规则正确转义,导致JSON解析失败。
解决方案
方案1:按当前COPY参数规则转义JSON双引号
在CSV的name字段中,用双引号包裹整个JSON字符串,同时将JSON内部的双引号用你设置的ESCAPE字符(单引号)转义,最终格式为:
"{'"en_US"': '"Test record"'}"
导入时PostgreSQL会自动将'"'解析为",得到合法的JSON字符串{"en_US": "Test record"}。
方案2:调整COPY命令的ESCAPE参数为双引号(推荐)
将COPY命令的ESCAPE参数改为双引号(与QUOTE一致,也是CSV模式默认行为),修改后的命令:
COPY table_name(id, name, create_uid, create_date, write_uid, write_date) FROM '/path/filename.csv' DELIMITER ',' CSV HEADER ENCODING 'UTF8' QUOTE '"' ESCAPE '"';
此时CSV的name字段格式为:
"{""en_US"": ""Test record""}"
两个连续的双引号会被解析为单个双引号,最终生成合法的JSONB内容。
方案3:禁用CSV引号处理(仅适用于无特殊字符的字段)
如果你的其他字段不包含逗号或双引号,可以禁用QUOTE功能,修改COPY命令:
COPY table_name(id, name, create_uid, create_date, write_uid, write_date) FROM '/path/filename.csv' DELIMITER ',' CSV HEADER ENCODING 'UTF8' QUOTE '\0';
此时CSV的name字段直接写原始JSON即可,无需包裹或转义:
{"en_US": "Test record"}
内容的提问来源于stack exchange,提问作者prakash
相关产品推荐
相关产品推荐

