2009-10-14 67 views
25

没有等价我得到以下异常:性格与编码UTF8在WIN1252

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

有没有根除此类字符的方式,无论是通过SQL或程序?
(SQL解决方案应该是首选)。

我想使用WIN1252连接到数据库,但它会给出同样的问题。

+1

请告诉我这个问题的解决方案,因为我有类似的问题。 – TopDeveloper 2011-09-12 23:03:01

+0

将数据库从LATIN1迁移到UTF8后,我的设置出现类似错误。当UNICODE被期望时,问题是ANSI ODBC驱动程序。 – plang 2011-11-24 09:45:55

回答

5

当您收到此消息时,您会做什么?你将文件导入到Postgres中吗?由于devstuff表示它是一个BOM字符。这是一个Windows首字符写入文本文件的字符,当它以UTF8编码保存时 - 它是不可见的0宽字符,因此在文本编辑器中打开时不会看到它。

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

+1

我们从源数据库(UTF-8编码的Teradata DB)获取一些数据并将其写入目标数据库(WIN1252编码的Postgres DB)。 我认为我们没有办法将这些字符转换为WIN1252,因为它们不受支持,这就是为什么我们想要从源数据库获取或保存到目标数据库时忽略这些字符的原因。 – 2009-10-15 04:11:51

+0

然后,您可以先将这些数据导入到bytea中,然后使用convert_from(string bytea,type text)。您可以使用“创建转换”来定义自己的功能进行转换。该功能可以忽略不在WIN1252中的字符。 更容易使用程序筛选器为您的数据“iconv -f utf-8 -t windows -1252 // translit”会做。 – Tometzky 2009-10-15 12:53:06

+1

更简单:将数据导入PostgreSQL中的临时UTF-8数据库,使用pg_dump导出到文本文件,使用“iconv -f utf-8 -t windows-1252 // translit”将文件转换为WIN1252,将文件转换回UTF- 8使用“iconv -t windows-1252 -t utf-8”,然后将该文件导入新的WIN1252数据库。 – Tometzky 2009-10-15 13:53:57

4

不要干扰角色,他们是真实的,并有很好的理由使用。而是,Win1252。

+0

我希望我可以,这是一个需求:) – 2009-10-14 10:00:49

1

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

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

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

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

+0

不,我们不能将目标数据库编码更改为UTF8。 – 2009-10-14 10:17:20

+1

0xFEFF的UTF-8编码形式是“0xEFBBBF”,而不是“0xEFBFBD”。 OP's是UTF-8编码形式的替换字符0x0fffd:“ ” – 2013-10-31 18:42:20

19

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

更多信息可在PostgreSQL wiki下的Character Set Support(devel文档)中找到。

1

我能够通过使用Postgres的子功能和选择,而不是绕过它:

select substring(comments from 1 for 200) from billing 

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

0

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

0

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

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

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;')