Sonderzeichen in MySQL seichern...

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
zoe
User
Beiträge: 8
Registriert: Donnerstag 29. März 2007, 10:28

Mittwoch 7. Mai 2008, 14:30

Hi !

Ich habe eine Tabelle in einer MySQL Datenbank und möchte in ein FEld vom typ "text" folgendes eintragen "Voilà une vidéo géniale". Wenn ich das über die cmd line direkt in mysql eingebe klappt es aber wenn ich den gleichen String über python versuche einzutragen bekomme ich einen Fehler (Error in Mysql-query).

Code: Alles auswählen

s = "Voilà une vidéo géniale"
"INSERT INTO keywords (word) VALUES('%s')" % (s)
Irgendwelche Vorschläge ? Danke!

Zoe
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 7. Mai 2008, 14:41

Das encoding stimmt sicherlich nicht!
Zum einen musst Du wissen, welches Coding in der DB verwendet wird (ich würde Dir zu "utf-8" raten!). Dann solltest Du den String am besten als Unicode vorliegen haben. Beim speichern in die DB, codierst Du ihn dann in den Zielzeichensatz.

Also z.B. so:

Code: Alles auswählen

s = u"Voilà une vidéo géniale"
foo.execute("INSERT INTO keywords (word) VALUES('%s')", s.encode("utf-8"))
Allerdings solltest Du mal gucken, ob der MySQLdb auch direkt unicode-Strings verarbeiten kann - dann kannst Du Dir das explizite encodieren sparen.

Allerdings ungetestet ;-)
zoe
User
Beiträge: 8
Registriert: Donnerstag 29. März 2007, 10:28

Mittwoch 7. Mai 2008, 15:05

So etwas hatte ich auch schon überlegt, das Problem ist, dass ich den String aus einer xml Datei parse und mir s.encode("utf-8") dann ständig Fehler der Art

Code: Alles auswählen

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 83: ordinal not in range(128)
liefert... :(
BlackJack

Mittwoch 7. Mai 2008, 21:29

Welchen Typ hat `s` denn an der Stelle wo Du das versuchst? `encode()` sollte man in diesem Fall nicht auf Zeichenketten, sondern auf Unicode-Objekten aufrufen.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 8. Mai 2008, 08:39

Wie immer: [wiki]Parametrisierte SQL-Queries[/wiki]verwenden und nicht den String selber mit "%" zusammen bauen.

Wenn möglich die Datenbank mit utf-8 erzeugen:

Code: Alles auswählen

CREATE DATABASE <dbname> CHARACTER SET utf8;
Und die neuste Version von MySQLdb nutzten, siehe: [wiki]MySQLdb troubleshooting[/wiki]

Die Variable sollte dann als unicode bei execute() übergeben werden. Wenn alles klappt, bekommt man beim select auch wieder unicode zurück und alles gut ;)

Generelle Überlegungen zum Thema: [wiki]Unicode[/wiki]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten