2013-08-16 21 views
5

Pracuję z bazą danych zawierającą wiele chińskich znaków. Mój kod wychodzi coś takiego:Ustawianie kodowania wyników zapytania w cx_Oracle/UnicodeDecodeError z chińskimi znakami

connection = cx_Oracle.connect("%s/%[email protected]%s:%s/%s" % (username, password, host, port, service_name)) 
cursor = connection.cursor() 
cursor.execute('SELECT HOTEL_ID,CREATE_TIME,SOURCE,CONTENT,TITLE,RATE,UPDATE_TIME FROM T_FX_COMMENTS') 

for row in cursor: 
    # Stuff goes here 
    pass 

Ale otrzymuję ten błąd:

Traceback (most recent call last): 
    File "test.py", line 17, in <module> 
    for row in cursor: 
UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 26: illegal multibyte sequence 

Wydaje GBK nie wystarczy. Chcę, aby cx-oracle dał mi GB18030 zakodowane wyniki, zamiast GBK. Jak mam to zrobic?

cx_Oracle.Connection.encoding jest tylko do odczytu ... Nie znalazłem niczego w dokumentacji cx-oracle sugerującej, że mogę to zrobić.

Jestem na Pythonie 3.3.2 i cx-oracle 5.1.2. Musi być coś, czego tu brakuje. Pomoc jest doceniana!

+0

Czy używasz Pythona 2 lub 3? – Maciek

+0

Ten sam scenariusz dla mnie ... czy znalazłeś rozwiązanie? – daveoncode

Odpowiedz

0

Spróbuj ustawić zmienną środowiskową NLS_LANG na początku programu:

import os 
os.environ["NLS_LANG"] = ".GB18030" 
+0

Daje mi ten błąd: 'cx_Oracle.DatabaseError: ORA-12705: Nie można uzyskać dostępu do plików danych NLS lub określone nieprawidłowe środowisko. W drodze do Python 3.3.2. – sorbet

4

byłem stoi ten sam problem i rozwiązać poprzez ustawienie zmiennej środowiskowej NLS_LANG do .AL32UTF8 (wydaje się swego rodzaju „zamiennika” że mówi "UTF-8 dla dowolnego języka")

+0

działa dla mnie. dzięki! – neolei

0

Użyj tego:

import os 
os.environ["NLS_LANG"] = ".zhs16gbk" 

os.environ [ "NLS_LANG"] jest dla Oracle .Spróbuj użyć formatu Oracle. Rozwiązałem to przy pomocy mojego python 2.6.8 i Oracle 11g.