【问题标题】:PostgreSQL: character with byte sequence 0xc2 0x81 in encoding "UTF8" has no equivalent in encoding "WIN1252"PostgreSQL:编码“UTF8”中字节序列为 0xc2 0x81 的字符在编码“WIN1252”中没有等价物
【发布时间】:2021-10-08 23:21:21
【问题描述】:

在对该表上的特定行执行SELECT 查询时遇到以下异常

ERROR:  character with byte sequence 0xc2 0x81 in encoding "UTF8" has no equivalent in encoding "WIN1252"

该行中的一个column 包含已用UTF-8 编码并插入其中的日语字符。

这个问题有什么解决办法吗?

【问题讨论】:

标签: postgresql encoding utf-8 character-encoding


【解决方案1】:

您应该知道您的数据库中使用了什么编码。

SHOW server_encoding;

当你连接到你的数据库时,你可以指定你的客户端应该使用什么编码:

SET client_encoding TO 'UTF8';

如果服务器和客户端编码不同,数据库驱动程序会尝试在这两种编码之间进行转换。当找不到等价字符时,抛出错误。

所以服务器编码和客户端编码应该是一样的,以免出现像你这样的问题。

解决您的问题:

  • 连接到您的数据库
  • client_encoding设置为UTF8
  • 用日文字符更新行

为避免以后出现此问题,请记住在连接到数据库时将client_encoding 设置为适当的值。

查看Supported Character Sets 上的文档。

【讨论】:

  • 两者都是UTF8 JapanDB=# SHOW server_encoding; server_encoding ----------------- UTF8 (1 row) JapanDB=# show client_encoding; client_encoding ----------------- UTF8 (1 行)
  • 是否可以在psql中将client_encoding默认为UTF8,这样我们就不用每次都执行了?
  • @MatthewMoisen 是的。使用PGCLIENTENCODING 环境变量或client_encoding 配置变量。见Automatic Character Set Conversion Between Server and Client
【解决方案2】:

here

我遇到了这个错误“错误:编码“UTF8”中字节序列<...>的字符在编码“WIN1252”中没有等效项;”同时使用 MySQL Workbench 将数据从 PostgreSQL 迁移到 MySQL。我不知道为什么会这样,因为目标 MySQL 数据库有 UTF8 编码,我认为一切都可以映射到它。

这个问题的真正根源原来是我用来连接源数据库并在工作台中指定的 PostgreSQL 驱动程序,它是 PostgreSQL ODBC 驱动程序 (ANSI),在我将其更改为 PostgreSQL ODBC 驱动程序 (UNICODE) 之后一切正常。

【讨论】:

  • 上帝保佑你!
【解决方案3】:

对于我来说,我是从 csv 文件导入数据,我需要连接到数据库,然后将客户端编码从 WIN1252 更改为 UTF8,然后从 csv 文件导入数据:

  • psql -h localhost -p 5432 -d timetrex -U postgres; // 连接数据库
  • set client_encoding to UTF8;
  • show client_encoding; // 此命令将显示当前编码
  • 当您仍在数据库中时,您需要以这种方式导入文件:COPY users FROM 'D:/Downloads/users_dump.csv' (format CSV , header true, DELIMITER ',' ,ENCODING 'UTF8') ; // 从 csv 文件中复制数据

【讨论】:

    【解决方案4】:

    Crystal Reports 在字段中看到这组字符时出现错误: [‎18/‎03/‎2019 年下午 2:20]

    最后我只是更改了该字段的内容,但除非我能找到一个为 UTF8 设计的像样的 PostgreSQL ODBC 驱动程序,否则我可能每隔几周就会看到这个问题出现,并且需要进行数据清理。

    【讨论】:

      【解决方案5】:

      水晶报告中发生在我身上...

      我更改了导致错误的视图列的内容...

      我发现字符 "0xc2 0x81" 等于 "chr(128)" - http://lwp.interglacial.com/appf_01.htm - 所以我替换了这个字符,如下所示:(replace((mi.complemento)::text, chr(128 ), 'C'::text))::character varying(400) AS 补充

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 2019-04-17
        相关资源
        最近更新 更多