Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL的rodbc字符编码错误_R_Postgresql_Rodbc_Greenplum - Fatal编程技术网

PostgreSQL的rodbc字符编码错误

PostgreSQL的rodbc字符编码错误,r,postgresql,rodbc,greenplum,R,Postgresql,Rodbc,Greenplum,在使用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: char

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

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

因此,我不确定是否有一个简单的解决方案,如果有任何解决方案的话。我所能推荐的最好方法是在服务器端包装某种转换,如果可以的话,查看数据过滤,或者在适当的情况下尝试其他语言(如中文、日文、韩文)


如果您确实决定包装转换器,.

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中使用的编码,并尝试使用任何拉丁类型。可能还涉及其他链接(例如油灰或类似的终端)。我很确定所有的编码都是ISO8859-1,也就是拉丁语-1。UTF-8被抛出,当0x80字符错误地映射到0xc280时,您会遇到麻烦

因此,请检查整个工作链中的编码,并确保它们都匹配。否则,在每个步骤之间进行的自动转换肯定会给某些字符带来麻烦


希望这有帮助。

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

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

您可以在此链接上找到此参数的相应代码:

以下是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

我本可以把这个回复贴到别的地方,但这里有

当从MS SQL管理客户端连接到Postgres DB时,我遇到了类似的错误。在我的例子中,修复源数据几乎是不可能的

我的设想:

  • 尝试通过连接使用MS SQL链接对象连接到Postgress ODBC系统DSN,请参阅错误,如“错误:字符0xc280 编码“UTF8”在“WIN1252”中没有等价物
  • 某些表上的Select语句有效,而其他表则抛出此错误
  • 修复:使用支持Unicode的ODBC驱动程序。我正在使用PostgreSQL全球开发组的ODBC驱动程序。转到配置DSN/管理DSN并选择Unicode驱动程序


    祝你好运。

    它在正常的R会话中工作吗?在这种情况下,
    sessionInfo()
    的输出可能会有所帮助。它看起来发生了一些变化,导致一个或两个系统区域设置/编码都发生了变化。(顺便问一下,
    odbcConnect()
    调用中的参数名
    belienRows
    )@Gavin不,它在正常的R会话中无法工作-只是尝试了一下。我刚刚添加了sessionInfo()的输出,并修复了打字错误。谢谢。我不知道为什么我的数据中会出现奇怪的字符,都是英文的,我查询的表都是聚合。我会调查一下。嘘,不要这么说。你应该用gobbledygook写,否则会给我们带来麻烦。-)我在Windows上的加密算法就是把所有东西都转换成UTF8-哇!谢谢你的解释。我认为问题的根源是表中的一个字段包含url查询字符串,其中可能包含奇怪的国际字符。但是,我已经能够通过ODBC使用其他客户端(如PgAdmin和RazorSQL)查询此表。奇怪。。。
    [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