2012-03-28 16 views
8

Próbuję wyciągnąć listę nazw tabel z bazy danych MySQL. Stosowne fragmenty kodu są następujące:Niepoprawne wyprowadzanie PyODBC UTF-16

conn = pyodbc.connect('...') 
cursor = conn.cursor() 
for table in cursor.tables(): 
    print table.table_name 

na każdym stole drukuje kilka znaków bełkot (skrzynek i znaków zapytania w diamenty). Korzystanie repr(table.table_name) drukuje:

u'\U00500041\U004c0050\U00430049\U00540041\U004f0049' 

dla tabeli o nazwie "wniosek".

Jeśli potraktujesz każdy znak 32-bitowy jako dwie 16-bitowe znaki, otrzymasz ciąg "PALPCITAOI". Zamiana par znaków (1 i 2, 3 i 4 itd.) Daje "APPLICATIO" (brak "N"). Przypuszczalnie zamienił N i znak null, w wyniku czego brakowało N (przy założeniu zakończonych znakiem zero łańcuchów).

Jak mogę poprawnie uzyskać nazwy tabel?

Działa w środowisku Python 2.4, PyODBC 2.1 i MySQL 5.0.22.

+4

Wygląda [ten bug] (http://code.google.com/p/pyodbc/issues/detail? id = 78 & can = 1 & q = UTF-16). Spróbuj użyć nowszej wersji PyODBC. –

+0

Nie mogłem znaleźć nowszej 32-bitowej wersji PyODBC dla systemu Linux (CENTOS 5.1), ale znalazłem tutaj kod źródłowy [http://code.google.com/p/pyodbc/downloads/list](http : //code.google.com/p/pyodbc/downloads/list). Czy ktoś wie, gdzie mogę znaleźć późniejszą wersję 32-bitowego RPM dla PyODBC? – Jonathan

+0

@Thomas K, Próbowałem dodać CHARSET = UTF8 do mojego ciągu połączenia, takiego jak: 'cnxn = pyodbc.connect ('DSN = localhost, CHARSET = UTF8')' i który działał na jednym z obszarów problemowych. Dziękuję za pomoc! – Jonathan

Odpowiedz

5

Dodanie CHARSET = UTF8 do działającego ciągu połączenia i mam teraz uruchomioną aplikację. Na przykład:

zmian

cnxn = pyodbc.connect('DSN=localhost')

do

cnxn = pyodbc.connect('DSN=localhost;CHARSET=UTF8')

Dziękuję Thomas dla wskazujące mnie we właściwym kierunku. Aktualizacja do późniejszej wersji PyODBC również może działać.