Seite 1 von 1

SQLAlchemy und UnicodeDecodeError

Verfasst: Samstag 4. April 2009, 13:09
von Daishy
Hi zusammen.

Ich versuche momentan mit Turbogears eine kleine Webseite ans laufen zu bekommen, allerdings pruegel ich mich schon seit zwei Tagen mit den Zeichensaetzen ^^.

Datenbank ist MySQL komplett auf UTF8: (Auszug aus show variables)

Code: Alles auswählen

character_set_client	utf8
character_set_connection	utf8
character_set_database	utf8
character_set_filesystem	binary
character_set_results	utf8
character_set_server	utf8
character_set_system	utf8
collation_connection	utf8_general_ci
collation_database	utf8_general_ci
collation_server	utf8_general_ci
Mein Model sieht wie folgt aus:

Code: Alles auswählen

# -*- coding: utf-8 -*-
...
adressTable = Table('adressen', metadata,
  Column('id', Integer, primary_key=True),
  Column('vorname', 
String)
)
Ist die Option #sqlalchemy.convert_unicode=True ausgeschaltet, dann kann ich im Controller ein Query durchfuehren, und dieses Query per print direkt ausgeben (Typ ist zu dem Zeitpunkt str), allerdings bekomme ich dann im Template einen UnicodeDecodeError (es wird versucht in 'ascii' zu decodieren, was ja nicht geht, weil die Daten utf8 sind)

Schalte ich die Option an, so schaegt das Query schon im Controller fehlt:

Code: Alles auswählen

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 5-10: unsupported Unicode code range
Hab schon wie ein bloeder gegooglet, aber die Tipps die ich gefunden haben bringen mich immer entweder zu dem einen oder dem anderen Fehler. Falls noch Informationen gebraucht werden, bitte einfach posten, ich liefer die dann sofort nach.

Vielen Dank und Schoene Gruesse,
Daishy

Verfasst: Samstag 4. April 2009, 14:40
von Daishy
Also ich habe grade nochmal etwas rumprobiert und mal probiert in meinem Controller die Daten per Hand zu encodieren.

Code: Alles auswählen

for row in set:
  uni = row.vorname.decode("latin-1") # Geht
  uni = row.vorname.decode("utf-8") # Schlaegt Fehl
Also scheinen die Daten ja beim uebertragen vom Server immernoch in Latin-1 umcodiert zu werden. Wie koennte ich SQLAlchemy denn sagen, dass er es statt utf8 mal mit latin-1 versuchen soll?

Verfasst: Samstag 4. April 2009, 15:20
von Daishy
Es scheint wirklich daran zu liegen, das MySQL immer noch latin-1 sendet. Nachdem ich dem Verbindungsstring nach explizit encoding="latin1" mitgegeben habe, hat er alles richtig codiert. Ist zwar irgendwie eine komische Loesung (da erst UTF-8->Latin->Unicode) aber es funktioniert erstmal ^^

Verfasst: Samstag 4. April 2009, 17:02
von tordmor
Spalte 'vorname' sollte wohl Unicode und nicht String sein.

Verfasst: Samstag 4. April 2009, 18:43
von Daishy
Hi,
Aendert leider auch nichts an dem Verhalten. Ich hab es jetzt auf autoload gestellt und convert_unicode auf true und krieg Unicode-Objekte geliefert.

Verfasst: Samstag 4. April 2009, 19:26
von Pekh
Ja, es liegt tatsächlich an der Codierung der Übertragung (Hab mich letzte Woche auch mit rumgeschlagen). Hänge einfach an den Connectionstring ein "?charset=utf8" ran, und das Problem ist Vergangenheit.