【问题标题】:Character with byte sequence 0x9d in encoding 'WIN1252' has no equivalent in encoding 'UTF8'编码“WIN1252”中字节序列为 0x9d 的字符在编码“UTF8”中没有等效项
【发布时间】:2017-06-27 01:46:09
【问题描述】:

我正在读取我的 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;

我收到以下错误:编码“WIN1252”中字节序列为 0x9d 的字符在编码“UTF8”中没有等效项。

谁能帮我解决这个问题的原因以及我该如何解决?

【问题讨论】:

    标签: postgresql encoding utf-8


    【解决方案1】:

    我今天遇到了这个问题,这是因为在 TEXT 列中我有从外部来源复制/粘贴的精美引号。

    【讨论】:

    • 虽然这肯定有帮助;复制/粘贴内容的任何视觉示例(代码示例?)都会有所帮助。
    【解决方案2】:

    只需将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
    

    【讨论】:

      【解决方案3】:

      问题是0x9D 不是WIN1252 中的有效字节值。 这里有一张桌子:https://en.wikipedia.org/wiki/Windows-1252

      问题可能是您正在导入 UTF-8 文件,而 postgresql 默认为 Windows-1252(我相信这是许多 Windows 系统上的默认设置)。

      在使用chcp 运行脚本之前,您需要在 Windows 命令行上更改字符集。或者在 postgresql 中你可以:

      SET CLIENT_ENCODING TO 'utf8';
      

      在导入文件之前。

      【讨论】:

      • 请记住,如果您想从 psql 工具中读取相同的数据,则必须运行相同的命令。
      • @UfukHacıoğulları 这是可能的,但不是必需的。细微的差别是这个问题将文件解释为与其实际编码不同的东西。您所描述的是当数据库中的字符在您的外壳的默认编码中不存在时。发生这种情况时看到的错误有点不同。
      【解决方案4】:

      任何编码都有有效代码的数字范围。你确定你的数据是win1252编码的吗?

      Postgres 非常严格,不会导入任何可能的编码损坏文件。你可以使用iconv,它可以在宽容模式下工作,它可以删除损坏的字符。通过iconv清理后即可导入文件。

      【讨论】:

      • 我刚刚在记事本中检查了文件的编码,它显示为“UTF8”。所以我不明白为什么它会给我编码问题的错误。
      • 也许你的 postgresql 客户端确实切换到 Win1252 编码。 “show client_encoding;”的结果是什么?
      • psql 中运行\encoding UTF8
      • 我尝试在 psql 中运行 \encoding UTF8 但它给出的错误为 'UTF8 : Invalid encoding name or conversion procedure not found
      • 我知道这是一篇旧帖子,但我刚刚遇到了这个问题,@Pavel Stehule 解决方案对我有用。命令其实是\encoding 'UTF8'
      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多