Problem mit doppelt kodierten Daten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Hase
User
Beiträge: 45
Registriert: Donnerstag 1. Oktober 2009, 15:17

Problem mit doppelt kodierten Daten

Beitragvon Hase » Mittwoch 18. Januar 2012, 14:16

Hallo,
ich habe ein recht komplexes Python-Programm (SqlAlchemy/Elixir-Basis), dass auf eine MySQL-DB zugreift. Es ist eine rein interne Anwendung die ich in dieser Form etwa 10 Mal auf verschiedenen Rechnern in verschiedenen Büros installiert habe, unter Windows und Linux. Dabei gab es nie Schwierigkeiten. Die Datenbank wurde dabei mit einem Dump der Referenzinstallation gefüllt. Nun habe ich meinen eigenen Rechner von OpenSuse auf Ubuntu Oneiric (wg. dauernder Querelen mit KDE) umgestellt, und ich kriege es nicht mehr zu laufen.

Folgende Fehlermeldung kommt so oder ähnlich beim Zugriff:

Code: Alles auswählen

  File "/usr/local/lib/python2.7/dist-packages/SQLAlchemy-0.6.7-py2.7.egg/sqlalchemy/processors.py", line 69, in process
    return decoder(value, errors)[0]
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 8: invalid continuation byte


Nach langer Suche habe ich folgendes feststellen können:
1. Die vorhandenen Daten in der DB sind definitiv korrekt utf-8 kodiert, bei Zugriff darauf erfolg o.g. Fehlermeldung
2. Bei Neueingabe von Daten in die DB sind diese innerhalb der DB doppelt utf-8 kodiert, bei Zugriff darauf erfolgt die Anzeige korrekt (!) ohne Fehlermeldung
3. Lasse ich das Python-Programm auf meinem Rechner laufen, greife aber dabei auf die Referenz-DB auf einem entfernten Rechner zu, kommt ebenfalls die Fehlermeldung, obwohl das selbe Programm auf dem Referenzrecher funktioniert.
4. Ich habe verschiedene Python-Versionen und sqlalchemy-Versionen durchprobiert, immer das gleiche Ergebnis, nämlich die obige Fehlermeldung, wenn auf vorhandene Daten zugegriffen wird

Mein Verdacht: irgendwas passiert mit den Daten zwischen dem Ausgang MySQL und dem Eingang bei SqlAlchemy bzw. umgekehrt, es erfolgt nämlich eine weitere, zusätzliche utf-8 kodierung bzw. dekodierung. Und es könnte was mit Ubuntu Oneiric zu tun haben, denn das selbe Python-Programm läuft ohne ein Byte Änderung auf anderen Rechnern mit Windows und Linux in verschiedenen Versionen problemlos. Mein Ubuntu ist auch voll auf UTF-8 eingestellt, soweit ich das sehen kann.

Kann mir jemand erklären, wass genau passiert zwischen der Datenausgabe bei MySQL und dem Eingang bei Python? Nimmt MySQLdb evtl. Änderunen vor, oder werden die Daten da einfach nur durchgereicht? Wo könnte die zusätzliche kodierung/dekodierung stattfinden? :K

Danke für die Hilfe

Hase
Benutzeravatar
noisefloor
User
Beiträge: 1432
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: Problem mit doppelt kodierten Daten

Beitragvon noisefloor » Mittwoch 18. Januar 2012, 20:19

Hallo,

Vermutung: Schau dir mal an, was für ein Transfer-Encoding bei MySQL unter Suse eingestellt ist. Bei Debian / Ubuntu ist es nämlich Laitn-1. Wenn's unter Suse was anderes ist könnte das eine Ursache sein.

Gruß, noisefloor
Hase
User
Beiträge: 45
Registriert: Donnerstag 1. Oktober 2009, 15:17

Re: Problem mit doppelt kodierten Daten

Beitragvon Hase » Donnerstag 19. Januar 2012, 10:32

Problem gelöst, wenn auch nicht 100% verstanden.

Ich denke weiterhin, das MySQLdb der Schuldige ist.

Das Problem kann durch explizite Angabe des Encodings in SqlAlchemy abgestellt werden. SqlAlchemy reicht diesen Parameter dann an MySQLdb weiter. Ich habe in meiner Konfigurationsdatei die Zeile:

Code: Alles auswählen

sqlalchemy.dburi="mysql://username:passwd@localhost:3306/mydb"


in

Code: Alles auswählen

sqlalchemy.dburi="mysql://username:passwd@localhost:3306/mydb?charset=utf8"


geändert.

H.

Zurück zu „Datenbankprogrammierung mit Python“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder