2011-08-23 15 views
7

के साथ रॉडबीसी कैरेक्टर एन्कोडिंग त्रुटि मुझे एक नई त्रुटि मिल रही है जिसे आरओडीबीसी का उपयोग करते हुए आर से ग्रीनप्लम पोस्टग्रेएसक्यूएल डेटाबेस से कनेक्ट करने से पहले कभी नहीं मिला है। मुझे ईएमएसीएस/ईएसएस और आरस्टूडियो दोनों का उपयोग करके त्रुटि मिली है, और आरओडीबीसी कॉल ने अतीत में काम किया है।पोस्टग्रेएसक्यूएल

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'" 

संपादित करें: बस एक और तालिका क्वेरी करने की कोशिश की और परिणाम प्राप्त किया था। तो मुझे लगता है कि यह एक आरओडीबीसी समस्या नहीं है लेकिन एक 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

क्या यह सामान्य आर सत्र में काम करता है? 'SessionInfo()' से आउटपुट इस मामले में सहायक हो सकता है। ऐसा लगता है कि कुछ बदल गया है जैसे कि एक या दोनों सिस्टम लोकेशंस/एन्कोडिंग बदल गए हैं। (वैसे, यह नहीं कि तर्क में एक टाइपो 'odbcConnect()' कॉल में 'believeNRows' नाम है?) –

+0

@ गैविन नहीं, यह सामान्य आर सत्र से काम नहीं करता है - बस कोशिश की गई। मैंने बस sessionInfo() से आउटपुट जोड़ा, और टाइपो को ठीक किया। – wahalulu

उत्तर

4

पहला, समस्या उत्पन्न होती है क्योंकि आर एक विंडोज लोकेल में कनवर्ट करने की कोशिश कर रहा है जो यूटीएफ 8 का समर्थन करता है। दुर्भाग्यवश, ब्रायन रिपली ने कई बार रिपोर्ट की है कि विंडोज़ में यूटीएफ 8 लोकेशंस नहीं हैं। वेब, स्टैक ओवरफ्लो, माइक्रोसॉफ्ट इत्यादि की खोज में बिताए गए घंटों से, मैं इस निष्कर्ष पर आया हूं कि माइक्रोसॉफ्ट यूटीएफ -8 से नफरत करता है विंडोज़ यूटीएफ 8 का समर्थन नहीं करेगा।

नतीजतन, मुझे यकीन नहीं है कि अगर कोई समाधान हो तो इसका कोई आसान समाधान नहीं है। सबसे अच्छा मैं अनुशंसा कर सकता हूं कि सर्वर की ओर से किसी प्रकार का रूपांतरण लपेटें, यदि आप कर सकते हैं तो डेटा फ़िल्टर करना देखें, या यदि उपयुक्त हो तो एक अलग भाषा का प्रयास करें (उदाहरण के लिए चीनी, जापानी, कोरियाई)।

यदि आप कनवर्टर को लपेटने का निर्णय लेते हैं, unicode.org recommendsthis ICU toolkit

+0

धन्यवाद। मुझे नहीं पता कि मुझे डेटा में फंकी वर्ण क्यों मिल रहे हैं, यह सब अंग्रेजी है और जिस तालिका में मैं पूछताछ कर रहा हूं वह सभी समेकन है। मैं इस पर गौर करूंगा। एमएस के लिए – wahalulu

+0

+1 यूटीएफ 8 से नफरत करता है :) – wahalulu

+0

शाह, स्पष्ट रूप से यह मत कहो। आपको इसे gobbledygook में लिखना चाहिए या आप हमें सभी को परेशानी में लाएंगे। ;-) विंडोज़ पर मेरा एन्क्रिप्शन एल्गोरिदम सिर्फ सब कुछ यूटीएफ 8 - वॉयला में परिवर्तित करना है! स्पष्टीकरण के लिए – Iterator

3

0xc280 एक नियंत्रण तत्व (यूनिकोड में यू +0080) है जो एसक्यूएल और पसंद का उपयोग करते समय अक्सर परेशानी पैदा कर रहा है। समस्या अक्सर रूपांतरण श्रृंखला में निहित होती है जो तब होती है जब आप विभिन्न एन्कोडिंग योजनाओं का उपयोग करने वाले विभिन्न अनुप्रयोगों का उपयोग करते हैं। विंडोज़ में अब तक यूटीएफ -8 शामिल है, इसलिए यह सख्ती से विंडोज़ समस्या नहीं है। मेरा मानना ​​है कि आर में डेटा पढ़ने से पहले समस्या उत्पन्न होती है।

वास्तव में, श्रृंखला में यूनिकोड में वर्ण अनुक्रम 0x80 को यूटीएफ -8 में 0xc280 में मैप किया जाएगा। यह एक नियंत्रण अनुक्रम माना जाता है, और मुद्रित नहीं किया जा सकता है। लेकिन संभावनाएं बड़ी हैं कि 0x80 वास्तव में यूनिकोड नहीं है, लेकिन विंडोज लैटिन -1 या लैटिन -2 है। उस स्थिति में, 0x80 यूरो चिह्न का प्रतिनिधित्व करता है। यह समझा सकता है कि यह आपके डेटा में कैसे समाप्त होता है। जांचें कि क्या आप डेटा में ऐसा कुछ पा सकते हैं, जो पहले से ही कुछ समझाएगा।

मेरा अनुमान है कि समाधान इस वर्कचेन के आर-एंड पर नहीं होगा, लेकिन इससे पहले। यह स्वचालित रूपांतरण का प्रयास करेगा, लेकिन कुछ मामलों में यह विफल होने की सूचना दी गई है (एसक्यूएल और ओरेकल बीटीडब्ल्यू के लिए भी)। Postgresql में आप किस एन्कोडिंग में काम कर रहे हैं, जांचें और किसी भी लैटिन प्रकार का उपयोग करने का प्रयास करें। इसमें अन्य लिंक शामिल हो सकते हैं (उदाहरण के लिए पुट्टी या समान टर्मिनल)। मुझे पूरा यकीन है कि सभी एन्कोडिंग ISO8859-1 हैं, जो लैटिन -1 है। कहीं यूटीएफ -8 को बीच में फेंक दिया जाता है, और जब 0x80 चरित्र को 0xc280 में गलत तरीके से मैप किया जाता है, तो आपको परेशानी होती है।

तो अपने पूरे कार्यक्षेत्र में एन्कोडिंग की जांच करें, और सुनिश्चित करें कि वे सभी मेल खाते हैं। यदि वे नहीं करते हैं, तो प्रत्येक चरण के बीच स्वचालित रूपांतरण कुछ पात्रों के लिए परेशानी देने के लिए बाध्य है।

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद। मुझे लगता है कि समस्या का स्रोत यह है कि तालिका में एक फ़ील्ड में यूआरएल क्वेरी स्ट्रिंग्स हैं जिनमें अजीब अंतरराष्ट्रीय पात्र हो सकते हैं। हालांकि, मैं अन्य क्लाइंट्स का उपयोग ओडीबीसी जैसे PgAdmin और RazorSQL के माध्यम से इस तालिका से पूछने में सक्षम हूं। अजीब... – wahalulu

0

डिफ़ॉल्ट रूप से ग्रीनप्लम चरित्र एन्कोडिंग के लिए यूटीएफ 8 का उपयोग करता है। आप ग्रीनप्लम सर्वर में लॉग इन करके और ग्रीनप्लम के लिए psql - console क्लाइंट लॉन्च करके इसे देख सकते हैं। इस कंसोल एप्लिकेशन में आप आदेश जारी कर सकते हैं: \l ग्रीनप्लम में कॉन्फ़िगर किए गए सभी डेटाबेस सूचीबद्ध करने के लिए - यह डेटाबेस के लिए वर्ण सेट का भी वर्णन करना चाहिए।

मुझे लगता है कि आपका तर्क यह है कि आर वर्णों के लिए यूटीएफ 8 का समर्थन नहीं करता है (आप विभिन्न लोकेल का उपयोग करते हैं) लेकिन आप ओडीबीसी ड्राइवर में ऑन-द-फ्लाई ट्रांसकोडिंग का उपयोग कर सकते हैं।सभी ओडीबीसी ड्राइवरों के बारे में निश्चित नहीं है लेकिन DataDirect ड्राइवर odbc.ini फ़ाइल (आमतौर पर उपयोगकर्ता होम निर्देशिका में स्थित) में अतिरिक्त विकल्प का समर्थन करते हैं - IANAAppCodePage।

आप इस लिंक पर इस पैरामीटर के लिए उचित कोड मिल सकता है:

[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 पोस्ट किया है सकते हैं, लेकिन यहाँ जाता है: http://www.iana.org/assignments/character-sets

यहां उदाहरण के आयुध डिपो ODBC.ini सामग्री है।

एमएस एसक्यूएल प्रबंधन क्लाइंट से पोस्टग्रेस डीबी से कनेक्ट करते समय मुझे समान त्रुटि मिलती है। स्रोत डेटा को ठीक करने के लिए टायरिंग मेरे मामले में लगभग असंभव है।

मेरे परिदृश्य:

  1. एक ODBC सिस्टम DSN के माध्यम से एमएस एसक्यूएल लिंक्ड वस्तुओं का उपयोग कर Postgress से कनेक्ट है, और इस तरह के रूप त्रुटियों को देखने की कोशिश कर रहा "त्रुटि: चरित्र की 0xc280 एन्कोडिंग" UTF8 "में कोई समकक्ष है "WIN1252", कुछ टेबल पर
  2. बयानों का चयन काम करते हैं और दूसरों को इस त्रुटि फेंक

फिक्स:। एक ODBC ड्राइवर यूनिकोड का समर्थन करता है कि का उपयोग करें मैं PostgreSQL वैश्विक विकास जी से एक ODBC ड्राइवर का उपयोग कर रहा हूँ। roup। डीएसएन कॉन्फ़िगर करें/डीएसएन प्रबंधित करें और यूनिकोड ड्राइवर का चयन करें।

शुभकामनाएं।

संबंधित मुद्दे