PostgreSQL的rodbc字符编码错误
在使用RODBC从R连接到GreenPlum PostgreSQL数据库时,我遇到了一个前所未有的新错误。我使用EMACS/ESS和RStudio都得到了错误,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
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时,我遇到了类似的错误。在我的例子中,修复源数据几乎是不可能的 我的设想:
祝你好运。它在正常的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