编码' WIN1252'中字节序列为0x9d的字符没有相应的编码' UTF8'

时间:2017-02-09 06:52:34

标签: postgresql encoding utf-8

我正在读取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'。

任何人都可以帮我解决这个问题的原因,我该如何解决?

4 个答案:

答案 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