2011-08-23 121 views
7

當我從R連接到使用RODBC的GreenPlum PostgreSQL數據庫時,我遇到了一個我從未得到過的新錯誤。我已經使用EMACS/ESS和RStudio得到了錯誤,並且RODBC調用按照過去的方式工作。PostgreSQL的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 
> 
+0

是否在正常的R對話工作嗎? 'sessionInfo()'的輸出在這種情況下可能會有所幫助。它看起來像一些東西已經改變,使一個或兩個系統語言環境/編碼已經改變。 (順便說一句,sn't,在參數名稱'believeNRows'一個錯字在'odbcConnect()'調用?) –

+0

@Gavin沒有不正常R對話的工作 - 只是嘗試。我剛剛添加了sessionInfo()的輸出,並修正了錯字。 – wahalulu

回答

4

首先,問題出現是因爲R試圖轉換爲支持UTF8的Windows語言環境。不幸的是,Brian Ripley多次報告說Windows沒有UTF8語言環境。從搜索網站,StackOverflow,微軟等幾小時,我得出結論,微軟 討厭UTF-8 Windows將不支持UTF8。

因此,如果有任何解決方案,我不確定是否有簡單的解決方案。我可以推薦的最好辦法是在服務器端封裝某種轉換,如果可以的話過濾數據,或者在適當的情況下嘗試不同的語言(例如中文,日文,韓文)。

如果你決定包裝一個轉換器,unicode.org recommendsthis ICU toolkit

+0

謝謝。我不知道爲什麼我會在數據中使用時髦的字符,它全部是英文,我查詢的表格是所有聚合。我會研究它。 – wahalulu

+0

+1爲MS恨UTF8 :) – wahalulu

+0

噓,不要說明確。你應該把它寫在gobbledygook中,否則你會讓我們都陷入困境。 ;-)我在Windows上的加密算法是將所有內容都轉換爲UTF8 - 瞧! – Iterator

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 btw)。檢查您在Postgresql中使用哪種編碼,並嘗試使用任何拉丁類型。可能還有其他的鏈接(例如膩子或類似的終端)。我很確定所有的編碼都是ISO8859-1,即Latin-1。在某個地方UTF-8被拋出,當0x80字符被錯誤地映射到0xc280時,你會遇到麻煩。

因此,請檢查完整工作鏈中的編碼,並確保它們全部匹配。如果他們不這樣做,那麼在每一步之間自動完成的轉換必然會給某些字符帶來麻煩。

希望這會有所幫助。

+0

感謝您的解釋。我認爲問題的根源在於表中的字段包含可能包含奇怪國際字符的網址查詢字符串。但是,我已經能夠使用其他客戶端通過ODBC查詢此表,例如PgAdmin和RazorSQL。奇怪的... – wahalulu

0

默認情況下,Greenplum使用UTF8進行字符編碼。您可以通過登錄到Greenplum服務器並啓動Greenplum的psql - 控制檯客戶端來進行檢查。 在這個控制檯應用程序中,您可以發出命令:\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 
1

我可能會elswhere張貼了這個反應,但在這裏不用。

從MS SQL管理客戶端連接到的Postgres數據庫時,我得到類似的錯誤。 Tyring修復源數據在我的情況下幾乎是不可能的。

我的場景:

  1. 試圖經由 ODBC系統DSN使用MS SQL鏈接對象連接到Postgress,並看到錯誤,如「錯誤:字符的 0xc280編碼‘UTF8’在沒有等效「WIN1252」
  2. 一些表Select語句的工作和其他人拋出這個錯誤

修復:使用支持Unicode的ODBC驅動程序我使用來自PostgreSQL全球開發g的ODBC驅動程序。 roup。轉到配置DSN /管理DSN並選擇Unicode驅動程序。

祝你好運。