2013-01-09 26 views
15

का उपयोग कर यूनिकोड डालने में सक्षम नहीं हो रहा है मुझे ओरेकल स्कीमा में यूनिकोड डालने में कोई समस्या है, मुझे लगता है कि डेटाबेस एक ओरेकल 11 जी उदाहरण है लेकिन इस बिंदु पर निश्चित नहीं है। मैं ओएस एक्स 10.6.8 पर पाइथन 2.6.1 का उपयोग कर रहा हूं (यह पायथन का सिस्टम कथन है) और sourceforge.net से डाउनलोड किए गए सीएक्स-ओरेकल ड्राइवर मॉड्यूल संस्करण 5.1 का उपयोग कर रहा हूं, वर्चुअलएन्व 1.6.1 उदाहरण में बनाया गया है और स्थापित है साइट संकुल के साथ दृश्यमान। मेरे स्क्रिप्ट के रूप मेंसीएक्स-ओरेकल

import cx_Oracle 

    connection = cx_Oracle.connect(
     "<name>/<password>@<host>/<service-name>" 
    ) 
    cursor = connection.cursor() 
    result = cursor.execute(u"create table UNICODE_TEST (id NUMBER(6), text NCLOB not NULL)") 

    raw_text = open("test.txt",'r').read() 
    if isinstance(raw_text,str): 
     raw_text = raw_text.decode("utf_8") 

    statement = u"insert into UNICODE_TEST (id, text) values (1,'%s')" % raw_text 
    result = cursor.execute(statement) 

मैं एक कनेक्शन बनाने के इस प्रकार है,, कर्सर बनाने प्रकार संख्या और NCLOB की एक आईडी और पाठ क्षेत्र के साथ एक परीक्षण तालिका बनाने के लिए एक बयान पर अमल है। मैं एक फ़ाइल खोलता हूं जिसमें मुझे यूटीएफ -8 में एन्कोड किए गए टेक्स्ट होने के बारे में पता है, स्ट्रिंग को यूनिकोड में डीकोड करें। यूनिकोड स्ट्रिंग में एक सम्मिलित स्टेटमेंट बनाएं और उस कथन को निष्पादित करें, और नतीजा यह त्रुटि है।

Traceback (most recent call last): 
    File "unicode-test.py", line 19, in <module> 
     result = cursor.execute(statement) 
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 170: ordinal not in range(128) 

कुछ Oracle स्कीमा में डालने से पहले ASCII के रूप में मेरे बयान एन्कोड करने के लिए कोशिश कर रहा है। तो मैं बेहतर यूनिकोड को समझने के लिए CX-ओरेकल संभालती देख आसपास शिकार शुरू कर दिया और CX-ओरेकल स्रोत मैं

परिवर्तन 5.0.4 से 5.1
को sourceforge.net से डाउनलोड की HISTORY.txt में यह पाया 1) यूनिकोड मोड और के लिए समर्थन निकालें में यूनिकोड को पारित करने की अनुमति दें, हर जगह एक स्ट्रिंग पास की जा सकती है। इसका मतलब है कि तार एनएलएस_एलएएनजी पर्यावरण वैरिएबल पाइथन 3.x में वैरिएबल के मूल्य का उपयोग कर ओरेकल तक पारित हो जाएगा। भी। ऐसा करने से समस्याओं का एक गुच्छा समाप्त हो गया जो UNICODE मोड का उपयोग करके खोजे गए थे और पाइथन 2.x में एक अनावश्यक प्रतिबंध को भी हटा दिया गया था, उदाहरण के लिए कनेक्ट स्ट्रिंग्स या SQL कथन में यूनिकोड का उपयोग नहीं किया जा सका। ...

मेरे धारणा है कि NLS_LANG वातावरण चर 'ascii' या कुछ बराबर करने के लिए सेट कर दिया जाता है, इसलिए मैं NLS_LANG करने के लिए 'AL32UTF8' जो मेरा मानना ​​है कि यूनिकोड के लिए सही मान है सेट करके देखें, और सेट किया गया है मेरा कनेक्शन बनाने से पहले नया मूल्य।

os.environ["NLS_LANG"] = "AL32UTF8" 
    connection = cx_Oracle.connect(
     "<user>/<password>@<host>/<service-name>" 
    ) 
    cursor = connection.cursor() 
    ... 

लेकिन मुझे यह त्रुटि मिलती है।

Traceback (most recent call last): 
    File "unicode-test.py", line 11, in <module> 
     "<user>/<password>@<host>/<service-name>" 
    cx_Oracle.DatabaseError: ORA-12705: Cannot access NLS data files or invalid environment specified 

तो ऐसा लगता है कि मैं एनएलएस_एलएएनजी मूल्य के साथ छेड़छाड़ नहीं कर सकता।

अभी मेरे प्रश्न हैं। क्या मुझे गलत कॉलम प्रकार की तरह कुछ आसान याद आ रहा है? सीएक्स-ओरेकल ड्राइवर के साथ समस्या है? क्या मुझे सीएक्स-ओरेकल मॉड्यूल का निर्माण करते समय "WITH_UNICODE" पर्यावरण चर सेट करने की आवश्यकता है और मैं यह कैसे करूँगा? ओरेकल उदाहरण के साथ मुद्दा क्या है? मुझे ओरेकल के साथ थोड़ा सा अनुभव है और मैंने कभी ओरेकल और पायथन के साथ काम नहीं किया है। मैंने इस मुद्दे पर काम करने में दो दिन व्यतीत किए हैं और डीबीए समूह में जाने से पहले समस्या क्या है इससे बेहतर समझना चाहूंगा।

धन्यवाद,

उत्तर

14

वातावरण चर सेट करना सही तरीका है, लेकिन "AL32UTF8" NLS_LANG के लिए सही मूल्य नहीं है। ओरेकल के आपके उदाहरण में उपयोग किए गए एनएलएस_एलएएनजी का सही मूल्य प्राप्त करने के लिए,

SELECT USERENV ('language') FROM DUAL 
+0

उत्तर के लिए धन्यवाद, मुझे अंत में मेरे डीबीए से प्रतिक्रिया मिली।हमारी 11 जीआर 2 स्थापना के लिए वर्णक सेट 'WE8MSWIN1252' है और राष्ट्रीय वर्णक सेट 'AL16UTF16' है। ऐसा प्रतीत होता है कि ड्राइवर ऊपर दिए गए चर में सही ढंग से एन्कोडिंग सेट का पता नहीं लगा रहा है। कनेक्शन पर 'एन्कोडिंग' और 'एनकोडिंग' विशेषताओं की जांच करना गलत है, दोनों मामलों में 'यूएस-एएससीआईआई' उत्पन्न करता है। एनएलएस_एलएएनजी को 'AL16UTF16' करने का प्रयास करते समय भी मुझे वही डाटाबेस त्रुटि मिलती है, क्योंकि स्कीमा से मेरा कनेक्शन हटा दिया जाता है (और उत्पादन में भी होगा) बताता है कि उन फ़ाइलों को क्यों एक्सेस नहीं किया जा सकता है। – snarkyname77

+0

मेरी स्थिति में, उपरोक्त क्वेरी से मेरा परिणाम "AMERICAN_AMERICA.US7ASCII" है। हालांकि, मेरे एनएलएस_एलएएनजी को "_.AL32UTF8" (उद्धरण के बिना) पर सेट करने के बाद, मेरे यूनिकोड आवेषण सही तरीके से काम करना शुरू कर दिया। – davidjb

+0

उपर्युक्त क्वेरी से मेरा परिणाम AMERICAN_AMERICA.WE8MSWIN1252 है। @davidjb, आप उद्धरण के बिना उस मूल्य पर कैसे सेट करते हैं। इसे पाने के लिए आपने अपने दायरे में क्या आयात किया है? – ThatAintWorking