Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

कैसे सही एन्कोडिंग के साथ QOCI या QODBC का उपयोग कर डेटाबेस से कनेक्ट करने के लिए?

मैंने

. का उपयोग करके एक समाधान बनाया है
  • Oracle डेटाबेस 12c डेटाबेस कैरेक्टरसेट AL32UTF8 के साथ (यूनिकोड स्टोर करने के लिए अनिवार्य !!)
  • स्कॉट स्कीमा
  • ओरेकल इंस्टेंट क्लाइंट 12.2 ओडीबीसी पैकेज के साथ (ओरेकल से मुफ्त में डाउनलोड किया जा सकता है)
  • Oracle SQL Developer (यूनिकोड वर्णों को इनपुट करने और Java/JDBC द्वारा कनेक्ट करने में सक्षम टूल)
  • पायथन 3.8

नीचे दिया गया पायथन कोड मेरी समझ में स्वयं समझा रहा है - कनेक्ट स्ट्रिंग में केवल आईपी, पोर्ट और सेवा को बदलने की जरूरत है। शेल/cmd पर यूनिकोड वर्ण देखने के लिए, आपको पर्यावरण चर सेट करने की आवश्यकता है

PYTHONIOENCODING=UTF-8

दुर्भाग्य से यह ग्रहण आईडीई पर पीईडीईवी के साथ काम नहीं करता है इसलिए मैंने चलने वाले कोड को छोड़कर कोशिश की। मुझे कुछ घंटों के लिए सिरदर्द दिया...

#  
# Safe python file as UTF-8 - otherwise you get no UTF-8 output !!!!
#
# Unix: 
#   export PYTHONIOENCODING=UTF-8
# 
# Windows:
#   set PYTHONIOENCODING=UTF-8
#
# Eclipse/PyDev: 
#   create for run/debug environment variable  
#   PYTHONIOENCODING=UTF-8
#
# ODBC: 
#   Oracle Instantclient 12.2 + ODBC package
#
# DB:
#   Oracle RDBMS 12.2 with Database Characterset AL32UTF8 to allow Unicode
#
# SQL Tool to Execute SQL (JDBC)
#   Oracle SQL Developer
#
# SQL
#   connect scott/tiger
#   create table polish(col1 varchar2(50));
#   insert into polish(col1) values('SQLD ł ń');
#   commit;
#
# 
import pyodbc 

bl = " "
UTF8 = "UTF-8"     
strict = "Strict"
s1 = "Test "+UTF8
print(s1)
s1 = chr(322) + bl + chr(324) 
m = bytes(s1,UTF8)   
print(m)
try:       
    print(m.decode(UTF8,strict))
except:
    pass 
print()  

print("Test ODBC and " + UTF8)        
print("Test ODBC and " + UTF8)  
cs = "DRIVER={DRIVERNAME};UID={USERID};PWD={PASSWD};DBQ={IP_OR_HOSTNAME}:{PORT}/{SERVICE_OR_SID};"
csfill = cs.format(DRIVERNAME="Oracle in instantclient_12_2", 
                   IP_OR_HOSTNAME="111.222.33.44", 
                   PORT=12102, 
                   SERVICE_OR_SID="DB1212UTF",
                   USERID="SCOTT",
                   PASSWD="tiger")     
print(csfill)      
cn = pyodbc.connect(csfill)

cursor = cn.cursor()
# Do the insert - can be done using normal parameters and Unicode strings...
cursor.execute("insert into Polish(COL1) values ( ? )", u"Python ł ń")

# perform commit if want to inspect in SQL Developer
# cursor.commit()

cursor = cn.cursor()
# We need to cast COL1 so that unicode is shipped as ' \xxxx'
# unfortunatly Unicode deos not work directly 
# so we use ASCIISTR() to do that...
cursor.execute('SELECT ASCIISTR(COL1)"COL1" from Polish') 
rows = cursor.fetchall()


for row in rows: 
    s =""
    x = row.COL1   
    y = 0
    j = len(x)-1
    # Parse incoming column for Oracle-Style Unicode like ' \0142'
    while y <= j:
        if y + 5 <= j: 
            # detect if oracle unicode begins with blank and slash ->  ' \'
            sc = x[y]+x[y+1]
            if sc == " \\":
                # create unicode character
                c = x[y+2]+x[y+3]+x[y+4]+x[y+5]
                s += bl + chr(int(c,16))
                # step forward to next character
                y += 5  
            else:
                # no unicode 4 characters before end !! 
                s += chr(ord(x[y]))        
        else:
            # no unicode - regular ASCII
            s += chr(ord(x[y]))          
        y += 1  
    m = bytes(s,UTF8)     
    print(m)  
    try:
        print(m.decode(UTF8,strict))
    except:
        pass   
cursor.close()
cn.close()   

रनिंग एप्लिकेशन देता है

Test UTF-8
b'\xc5\x82 \xc5\x84'
ł ń

Test ODBC and UTF-8
DRIVER=Oracle in instantclient_12_2;UID=SCOTT;PWD=tiger;DBQ=111.222.33.44:12102/DB1212UTF;
b'SQLD \xc5\x82 \xc5\x84'
SQLD ł ń
b'Python \xc5\x82 \xc5\x84'
Python ł ń


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. दो अलग-अलग तालिकाओं से राशि जोड़ें Oracle

  2. क्या ओरेकल राउनम का मूल्यांकन करने से पहले सभी पंक्तियों को प्राप्त करता है?

  3. दोहरी क्वेरी के परिणाम सेट का उपयोग करके तालिका में सम्मिलित करें?

  4. ऑफ़सेट परिवर्तनीय होने पर मैं अगली घटना कैसे प्राप्त करूं?

  5. Oracle एपेक्स डेटाबेस ट्रिगर - डेटाबेस कॉलम को संदर्भित करने में समस्या