PSQLite3 Umlaute - das leidige Thema

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Hallo,

ich habe eine SQLite-Datenbank, in der ich einige Werte speichern möchte.
Das klappt auch alles soweit ganz gut, bis ich versuche, Umlaute wieder
auszulesen. Das Speichern funktioniert einwandfrei, die Daten sind auch drin,
das kann man im SQLite Manager (Firefox Plugin) sehen, aber sobald
ich versuche, die Daten auszulesen, bekomme ich folgende Exception:
sqlite3.OperationalError: Could not decode to UTF-8 column 'last_name' with text 'M³ller'
Ich habe schon viele andere Threads zu dem Thema gelesen und habe auch schon versucht,
den Querystring zum Reinschreiben per u"Müller" in Unicode umzuwandeln, allerdings schreibt
er mir dann nichts mehr in die Tabelle. Meine Quellcode-Dateien sind als UTF-8 abgespeichert
und das Coding in der ersten Zeile ist auch UTF-8:

Code: Alles auswählen

_*_ coding: utf-8 _*_
hat jemand Ahnung, warum nichts mehr in die Datenbank geschrieben wird,
wenn die Query aus einem Unicode-String besteht?
Python-Version: 2.5
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Spaten hat geschrieben:
sqlite3.OperationalError: Could not decode to UTF-8 column 'last_name' with text 'M³ller'
Hallo Spaten!

- http://halvar.at/python/pysqlite_umlaute/
- http://www.python-forum.de/topic-6393.h ... te+unicode
- http://www.python-forum.de/topic-12986. ... te+unicode

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Hallo Gerold,

danke für deine schnelle Antwort, aber die Beiträge hatte ich schon gelesen.
Mein Problem war, dass die Query gar nicht mehr ausgeführt wurde,
wenn Sonderzeichen im String enthalten waren.
Das lag allerdings daran, dass ich die Exception, die das Decoden verursacht
hat, per try abgefangen habe.

In dem zweiten Link steht ein Beispiel mit

Code: Alles auswählen

u"Geroldä"
Das funktioniert bei mir allerdings nicht, wenn ich das mache,
bekomme ich einen UnicodeDecodeError.
Er sagt, der Ascii-Codec kann ein Byte nicht dekodieren, da es größer als 127 ist.

Kann es daran liegen, dass ich Teile des Strings direkt aus einem wxTextEntryDialog einlese
und wx mit einem anderen Encoding arbeitet?
Python-Version: 2.5
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Spaten!
Spaten hat geschrieben:aber die Beiträge hatte ich schon gelesen
Hast du dir diesen Thread http://www.python-forum.de/topic-6393.html wirklich durchgelesen und auch die Beispiele ausprobiert?
Spaten hat geschrieben:Mein Problem war, dass die Query gar nicht mehr ausgeführt wurde, wenn Sonderzeichen im String enthalten waren.
Kann es sein, dass du die Unicode-Daten nicht an ``execute``, sondern in den SQL-String schreibst?

Also so

Code: Alles auswählen

sql = "SELECT vorname from adressen WHERE nachname = '%s'" % u"öäüßßßß"
cur.execute(sql)
statt so?

Code: Alles auswählen

sql = "SELECT vorname from adressen WHERE nachname = ?"
cur.execute(sql, u"öäüßßßß")
Spaten hat geschrieben:In dem zweiten Link steht ein Beispiel mit

Code: Alles auswählen

u"Geroldä"
Das funktioniert bei mir allerdings nicht, wenn ich das mache,
bekomme ich einen UnicodeDecodeError.
Er sagt, der Ascii-Codec kann ein Byte nicht dekodieren, da es größer als 127 ist.
Ahh. Also doch ausprobiert. Dann liegt es daran, dass du im Code zwar ein Encoding-Cookie angibst, aber im Cookie nicht exakt das Encoding angibst, in dem der Code abgespeichert wurde. Wenn du als Encoding-Cookie ``# -*- coding: iso-8859-1 -*-`` angibst, dann muss der Code auch in diesem Encoding abgespeichert werden. Wenn du hier ``iso-8859-1`` angibst und du speicherst den Code mit ``utf-8`` ab, dann funktioniert das natürlich nicht mehr.
Spaten hat geschrieben:Kann es daran liegen, dass ich Teile des Strings direkt aus einem wxTextEntryDialog einlese und wx mit einem anderen Encoding arbeitet?
Ich empfehle jedem, die Unicode-Version von wxPython zu verwenden. Dann ist sicher gestellt, dass du die Daten von z.B. einen *wx.TextCtrl* als Unicode zurück bekommst. Dann hast du einen definierten Zustand mit dem du arbeiten kannst.

Code: Alles auswählen

>>> import wx
>>> wx.version()
'2.8.7.1 (msw-unicode)'
>>>

So einen Text kannst du direkt an pySQLite übergeben und es wird dir diesen automatisch als UTF-8 in die Datenbank schreiben. Und beim Auslesen der Datenbank bekommst du garantiert Unicode zurück -- auch wieder ein definierter Zustand mit dem man arbeiten kann.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten