7

在使用 RODBC 从 R 连接到 GreenPlum PostgreSQL 数据库时,我遇到了一个以前从未遇到过的新错误。我使用 EMACS/ESS 和 RStudio 都遇到了错误,并且 RODBC 调用与过去一样工作。

library(RODBC)
gp <- odbcConnect("greenplum", believeNRows = FALSE)
data <- sqlQuery(gp, "select * from mytable")

> data
[1] "22P05 7 ERROR: character 0xc280 of encoding \"UTF8\" has no equivalent in  "WIN1252\";\nError while executing the query" 
[2] "[RODBC] ERROR: Could not SQLExecDirect 'select * from mytable'"

编辑:刚刚尝试查询另一个表并得到了结果。所以我猜这不是 RODBC 问题,而是 PostgreSQL 表编码问题。

R version 2.13.0 (2011-04-13)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RODBC_1.3-2
> 
4

4 回答 4

4

首先,出现问题是因为 R 试图转换为支持 UTF8 的 Windows 语言环境。不幸的是,Brian Ripley 多次报告说 Windows 没有 UTF8 语言环境。从花了几个小时搜索网络、StackOverflow、Microsoft 等,我得出的结论是,Microsoft讨厌 UTF-8 Windows 将不支持 UTF8。

因此,如果有任何解决方案,我不确定是否有一个简单的解决方案。我可以推荐的最好的方法是在服务器端进行某种转换,如果可以的话,看看过滤数据,或者尝试不同的语言,如果合适的话(例如中文、日文、韩文)。

如果你决定包装转换器,unicode.org 推荐 这个 ICU 工具包

于 2011-08-23T21:40:37.450 回答
3

0xc280 是一个控制元素(Unicode 中的 U+0080),在使用 SQL 等时经常会引起麻烦。问题通常在于转换链,当您使用使用不同编码方案的不同应用程序时,总是会发生这种情况。Windows 现在已经包含了 UTF-8,所以严格来说这不是 Windows 的问题。我相信问题出现在 R 读取数据之前。

事实上,在链中,UNICODE 中的字符序列 0x80 将映射到 UTF-8 中的 0xc280。这应该是一个控制序列,不能打印。但很有可能 0x80 实际上不是 UNICODE,而是 Windows Latin-1 或 Latin-2。在这种情况下,0x80 代表欧元符号。这可能解释了它如何最终出现在您的数据中。检查你是否可以在数据中找到类似的东西,这已经解释了一些事情。

我的猜测是,解决方案不会位于此工作链的 R 端,而是在此之前。它将尝试自动转换,但据报道在某些情况下会失败(顺便说一句,对于 SQL 和 Oracle)。检查您在 Postgresql 中使用的编码,并尝试使用任何 latin 类型。可能还涉及其他链接(例如 Putty 或类似终端)。我很确定那里的所有编码都是 ISO8859-1,即 Latin-1。UTF-8 介于两者之间,当 0x80 字符错误地映射到 0xc280 时,就会遇到麻烦。

因此,请检查整个工作链中的编码,并确保它们都匹配。如果他们不这样做,那么每个步骤之间完成的自动转换势必会给某些字符带来麻烦。

希望这可以帮助。

于 2011-08-24T01:06:22.560 回答
1

我可能已经在别处发布了这个回复,但这里有。

从 MS SQL 管理客户端连接到 Postgres DB 时出现类似错误。在我的情况下,修复源数据几乎是不可能的。

我的场景:

  1. 尝试通过 ODBC 系统 DSN 使用 MS SQL 链接对象连接到 Postgress,并看到诸如“错误:编码“UTF8”的字符 0xc280 在“WIN1252”中没有等效项等错误;
  2. 某些表上的选择语句有效,而另一些则抛出此错误。

修复:使用支持 Unicode 的 ODBC 驱动程序。我正在使用 PostgreSQL Global Development Group 的 ODBC 驱动程序。转到配置 DSN/管理 DSN 并选择 Unicode 驱动程序。

祝你好运。

于 2013-10-04T20:34:25.247 回答
0

默认情况下,Greenplum 使用 UTF8 进行字符编码。您可以通过登录到 Greenplum 服务器并启动 psql - Greenplum 的控制台客户端来检查这一点。在这个控制台应用程序中,您可以发出命令:\l列出 Greenplum 中配置的所有数据库——这也应该描述数据库的字符集。

我认为您的问题是 R 不支持字符的 UTF8(您使用不同的语言环境)但是您可以在 ODBC 驱动程序中使用动态转码。不确定所有 ODBC 驱动程序,但 DataDirect 驱动程序支持 odbc.ini 文件(通常位于用户主目录)中的额外选项 - IANAAppCodePage。

您可以在此链接上找到此参数的相应代码: http ://www.iana.org/assignments/character-sets

这是 od ODBC.ini 内容的示例:

[ODBC]
Driver=/opt/odbc/lib/S0gplm60.so
IANAAppCodePage=2252
AlternateServers=
ApplicationUsingThreads=1
ConnectionReset=0
ConnectionRetryCount=0
ConnectionRetryDelay=3
Database=mysdb
EnableDescribeParam=1
ExtendedColumnMetadata=0
FailoverGranularity=0
FailoverMode=0
FailoverPreconnect=0
FetchRefCursor=1
FetchTSWTZasTimestamp=0
FetchTWFSasTime=0
HostName=192.168.1.100
InitializationString=
LoadBalanceTimeout=0
LoadBalancing=0
LoginTimeout=15
LogonID=
MaxPoolSize=100
MinPoolSize=0
Password=
Pooling=0
PortNumber=5432  
QueryTimeout=0
ReportCodepageConversionErrors=0
TransactionErrorBehavior=1
XMLDescribeType=-10
于 2011-11-14T16:56:14.810 回答