我正在读取sql脚本中的csv文件并将其数据复制到postgre sql表中。代码行如下:
\copy participants_2013 from 'C:/Users/Acrotrend/Desktop/mip_sahil/mip/reelportdata/Participating_Individual_Extract_Report_MIPJunior_2013_160414135957.Csv' with CSV delimiter ',' quote '"' HEADER;
我收到以下错误:编码中字节序列为0x9d的字符' WIN1252'没有相应的编码' UTF8'。
任何人都可以帮我解决这个问题的原因,我该如何解决?
答案 0 :(得分:32)
问题是0x9D
不是WIN1252中的有效字节值。
这里有一张表:https://en.wikipedia.org/wiki/Windows-1252
问题可能是您正在导入UTF-8文件而postgresql默认为Windows-1252(我认为这是许多Windows系统上的默认设置)。
在使用chcp运行脚本之前,您需要更改Windows命令行上的字符集。或者在postgresql中你可以:
SET CLIENT_ENCODING TO 'utf8';
导入文件之前。
答案 1 :(得分:1)
任何编码都包含有效代码的数值范围。你确定你的数据是用win1252编码的吗?
Postgres非常严格,不会导入任何可能的编码损坏文件。您可以使用可以在容错模式下工作的iconv
,它可以删除损坏的字符。清除iconv
后,您可以导入文件。
答案 2 :(得分:1)
我今天遇到了这个问题,这是因为在TEXT列中有一些引人注目的引号,这些引号是从外部来源复制/粘贴的。
答案 3 :(得分:0)
只需将encoding 'UTF-8'
指定为\copy
命令中的编码,例如(出于可读性考虑,我将其分成两行,但都放在同一行):
\copy dest_table from 'C:/src-data.csv'
(format csv, header true, delimiter ',', encoding 'UTF8');
更多详细信息:
问题在于客户端编码设置为WIN1252
,最有可能是因为它在Windows计算机上运行,但是文件中包含UTF-8
字符。
您可以使用以下方式检查客户端编码
SHOW client_encoding;
client_encoding
-----------------
WIN1252