2012-03-28 7 views
8

Ich versuche, eine Liste von Tabellennamen aus einer MySQL-Datenbank herauszuziehen. Die entsprechenden Teile des Codes sind wie folgt:PyODBC gibt unpassendes UTF-16 aus

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

Für jede Tabelle druckt ein Bündel von Kauderwelsch Zeichen (Boxen und Fragezeichen in Diamanten). Mit repr(table.table_name) druckt:

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

für die Tabelle mit dem Namen "Application".

Wenn Sie jedes 32-Bit-Zeichen als zwei 16-Bit-Zeichen behandeln, erhalten Sie die Zeichenfolge "PALPCITAOI". Durch das Tauschen von Zeichenpaaren (1 und 2, 3 und 4 usw.) wird "APPLICATIO" erzeugt (das "N" fehlt). Vermutlich tauschte es N und das Nullzeichen, was zu dem fehlenden N führte (unter der Annahme von nullterminierten Strings).

Wie bekomme ich die Tabellennamen richtig?

Dies wird unter Python 2.4, PyODBC 2.1 und MySQL 5.0.22 ausgeführt.

+4

Sieht aus wie [dieser Fehler] (http://code.google.com/p/pyodbc/issues/detail? id = 78 & can = 1 & q = UTF-16). Versuchen Sie, eine neuere Version von PyODBC zu verwenden. –

+0

Ich konnte keine neuere 32-Bit-Version von PyODBC für Linux (CENTOS 5.1) finden, aber ich fand den Quellcode hier [http://code.google.com/p/pyodbc/downloads/list](http : //code.google.com/p/pyodbc/downloads/list). Weiß jemand, wo ich eine spätere Version eines 32 Bit RPM für PyODBC finden kann? – Jonathan

+0

@Thomas K, habe ich versucht, CHARSET = UTF8 zu meinem Verbindungsstring wie folgt hinzuzufügen: 'cnxn = pyodbc.connect ('DSN = localhost; CHARSET = UTF8')' und das hat auf einem der Problembereiche funktioniert. Vielen Dank für Ihre Hilfe! – Jonathan

Antwort

5

Das Hinzufügen von CHARSET = UTF8 zum Verbindungsstring funktioniert und ich habe jetzt die Anwendung in Betrieb genommen. Zum Beispiel:

Änderung

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

zu

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

Danke Thomas für den Hinweis mich in die richtige Richtung. Das Upgrade auf eine spätere Version von PyODBC funktioniert möglicherweise ebenfalls.