【问题标题】:rodbc character encoding error with PostgreSQLPostgreSQL 的 rodbc 字符编码错误
【发布时间】:2011-11-02 07:07:08
【问题描述】:

在使用 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
> 

【问题讨论】:

  • 它在正常的 R 会话中工作吗?在这种情况下,sessionInfo() 的输出可能会有所帮助。看起来有些事情发生了变化,以至于一个或两个系统语言环境/编码发生了变化。 (顺便说一句,odbcConnect() 调用中的参数名称 believeNRows 不是错字吗?)
  • @Gavin 不,它在正常的 R 会话中不起作用 - 刚刚尝试过。我刚刚添加了 sessionInfo() 的输出,并修正了错字。

标签: r postgresql rodbc greenplum


【解决方案1】:

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

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

如果您决定封装转换器,unicode.org recommendsthis ICU toolkit

【讨论】:

  • 谢谢。我不知道为什么我在数据中得到了时髦的字符,都是英文的,我查询的表都是聚合的。我会调查的。
  • 嘘,不要这么说。你应该把它写在 gobbledygook 中,否则会给我们带来麻烦。 ;-) 我在 Windows 上的加密算法是将所有内容都转换为 UTF8 - 瞧!
【解决方案2】:

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 时,就会遇到麻烦。

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

希望这会有所帮助。

【讨论】:

  • 感谢您的解释。我认为问题的根源在于表中的一个字段包含可能包含奇怪的国际字符的 url 查询字符串。但是,我已经能够通过 ODBC 使用其他客户端(例如 PgAdmin 和 RazorSQL)来查询此表。奇怪...
【解决方案3】:

我可能已经在其他地方发布了这个回复,但这里就可以了。

从 MS SQL 管理客户端连接到 Postgres DB 时出现类似错误。就我而言,试图修复源数据几乎是不可能的。

我的场景:

  1. 尝试使用 MS SQL 链接对象通过 ODBC System DSN,并看到诸如“ERROR: character 0xc280 of 编码“UTF8”在“WIN1252”中没有等价物;
  2. 某些表上的 Select 语句有效,而另一些则抛出此错误。

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

祝你好运。

【讨论】:

    【解决方案4】:

    默认情况下,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2017-03-08
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多