Seite 1 von 1

Sonderzeichen in MySQL seichern...

Verfasst: Mittwoch 7. Mai 2008, 14:30
von zoe
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

Verfasst: Mittwoch 7. Mai 2008, 14:41
von Hyperion
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 ;-)

Hmm

Verfasst: Mittwoch 7. Mai 2008, 15:05
von zoe
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... :(

Verfasst: Mittwoch 7. Mai 2008, 21:29
von BlackJack
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.

Verfasst: Donnerstag 8. Mai 2008, 08:39
von jens
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]