我收到以下异常:
Caused by: org.postgresql.util.PSQLException: ERROR: character 0xefbfbd of encoding "UTF8" has no equivalent in "WIN1252"
有没有办法通过SQL或编程方式消除这些字符?
(首选SQL解决方案)。
我正在考虑使用WIN1252连接数据库,但它会产生同样的问题。
答案 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设置字符集;