编码为UTF8的字符在WIN1252中没有等效字符

时间:2009-10-14 09:37:39

标签: postgresql encoding utf-8 character

我收到以下异常:

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

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

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

10 个答案:

答案 0 :(得分:27)

我遇到了类似的问题,在尝试\encoding UTF8之前,我通过在客户端中使用INSERT INTO foo (SELECT * from bar WHERE x=y);将编码设置为UTF8来解决问题。我的客户端使用WIN1252编码,但数据库是UTF8,因此出错。

Character Set Support(开发文档)下的PostgreSQL wiki上提供了更多信息。

答案 1 :(得分:7)

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:1)

我能够通过使用Postgres'来解决这个问题。 substring函数并选择它:

select substring(comments from 1 for 200) from billing

特殊角色开始每个领域的评论对最终解决它有很大的帮助。

答案 6 :(得分:0)

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

通过将驱动程序更改为UNICODE而不是ANSI来解决此问题(请参阅plang注释)。

答案 7 :(得分: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;')

答案 8 :(得分:0)

当我的Windows 10使用国语作为默认语言时,我遇到了这个问题。发生此问题,因为我确实尝试使用UTF-8导入数据库。通过psql进行检查并执行“ \ l”,它显示排序规则和cytpe是国语。

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

我在https://www.yodiw.com/fix-utf8-encoding-win1252-cputf8-postgresql-windows-10/

中写了完整的上下文和解决方案

答案 9 :(得分:0)

您可以更改编码

示例

String tmp // String that will be saved in postgre database
String utfString = new String(tmp.getBytes(Charset.forName("utf-8")));

我使用java.nio.Charset设置字符集;