39

我收到以下异常:

Caused by: org.postgresql.util.PSQLException: ERROR: character 0xefbfbd of encoding "UTF8" has no equivalent in "WIN1252"

有没有办法通过 SQL 或以编程方式消除这些字符?
(应该首选 SQL 解决方案)。

我正在考虑使用 WIN1252 连接到数据库,但它会产生同样的问题。

4

9 回答 9

36

我有一个类似的问题,我通过\encoding UTF8在客户端中将编码设置为 UTF8 来解决,然后再尝试INSERT INTO foo (SELECT * from bar WHERE x=y);. 我的客户端使用的是 WIN1252 编码,但数据库是 UTF8,因此出现错误。

更多信息可在 PostgreSQL wiki 上的字符集支持(开发文档)下获得。

于 2013-10-15T21:05:23.307 回答
12

当你收到这条消息时,你会怎么做?您是否将文件导入 Postgres?正如 devstuff 所说,它是一个 BOM 字符。这是 Windows 首先写入文本文件的字符,当它以 UTF8 编码保存时 - 它是不可见的 0 宽度字符,因此在文本编辑器中打开它时不会看到它。

尝试在例如记事本中打开此文件,以 ANSI 编码另存为,并在文件中添加(或替换类似的)set client_encoding to 'WIN1252'行。

于 2009-10-14T14:00:53.847 回答
7

不要抹杀这些角色,它们是真实的,并且有充分的理由使用。相反,根除 Win1252。

于 2009-10-14T09:53:09.333 回答
3

我有一个非常相似的问题。我有一个从 SQL Server 到 PostgreSQL 数据库的链接服务器。我在使用 openquery 语句选择的表中的一些数据有一些在 Win1252 中没有等效的字符。问题是我用于连接的系统 DSN 条目(在 ODBC 数据源管理器下)被配置为使用 PostgreSQL ANSI(x64) 而不是 PostgreSQL Unicode(x64)。创建一个支持 Unicode 的新数据源并创建一个新的修改后的链接服务器并在您的 openquery 中引用新的链接服务器为我解决了这个问题。快乐的时光。

于 2016-10-25T05:50:10.643 回答
1

这看起来像字节序列 0xBD、0xBF、0xEF 作为 little-endian 整数。这是 Unicode 字节顺序标记 (BOM) 字符 0xFEFF 的 UTF8 编码形式。

我不确定 Postgre 的正常行为是什么,但 BOM 通常仅用于输入流开头的编码检测,通常不会作为结果的一部分返回。

无论如何,您的异常是由于此代码点在 Win1252 代码页中没有映射。大多数其他非拉丁字符也会出现这种情况,例如亚洲文字中使用的字符。

您可以将数据库编码更改为 UTF8 而不是 1252 吗?这将允许您的列包含几乎任何字符。

于 2009-10-14T10:05:27.107 回答
1

我能够通过使用 Postgres 的 substring 函数并选择它来解决它:

select substring(comments from 1 for 200) from billing

特殊字符开始每个字段的注释对最终解决它有很大帮助。

于 2014-10-27T18:07:22.687 回答
0

我们在 2016 年 11 月 19 日左右出现了这个问题,我们的旧 Access 97 应用程序访问了一个 postgresql 9.1 数据库。

这已通过将驱动程序更改为 UNICODE 而不是 ANSI 来解决(请参阅计划注释)。

于 2016-11-22T17:35:16.103 回答
0

这对我有用: 1 在 sp_configure 中启用临时查询。2 为链接的 PostgreSQL 服务器添加 ODBC DSN。3 确保您同时拥有 ANSI 和 Unicode (x64) 驱动程序(同时尝试两者)。4 像下面这样运行查询 - 更改 UID、服务器 ip、数据库名称和密码。5 只需将查询保留在 postgreSQL 格式的最后一行。

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

SELECT * FROM OPENROWSET('MSDASQL', 
'Driver=PostgreSQL Unicode(x64); 
uid=loginid;
Server=1.2.3.41;
port=5432;
database=dbname;
pwd=password',

'select * FROM table_name limit 10;')
于 2017-11-02T19:11:38.630 回答
0

当我的 Windows 10 使用普通话中国作为默认语言时,我遇到了这个问题。出现此问题是因为我确实尝试使用 UTF-8 导入数据库。通过 psql 检查并执行“\l”,它显示 collat​​e 和 cytpe 是中国普通话。

解决方案,将操作系统语言重置回美国并重新安装 PostgreSQL。当整理回 UTF-8 时,您可以再次重置您的操作系统语言。

我在这里写了完整的上下文和解决方案https://www.yodiw.com/fix-utf8-encoding-win1252-cputf8-postgresql-windows-10/

于 2020-05-02T16:59:50.707 回答