Seite 1 von 1
mysql und umlaute -- ubuntu
Verfasst: Samstag 25. November 2006, 18:33
von rogen
wie bekomme ich einen umlaut in die datenbank
hier mein test code.
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
from MySQLdb import *
class mysqlabfr:
def __init__(self):
self.conn = connect(host="localhost",db="test2",user="root",passwd="")
def einf(self,text1,text2):
cursor = self.conn.cursor()
a = "INSERT INTO test VALUES(0,'"+str(text1)+"','"+str(text2)+"')"
print a
cursor.execute(a)
daten = mysqlabfr()
daten.einf("testäöo","test")
da kommt die fehlermeldung.
INSERT INTO test VALUES(0,'te�st','test')
Traceback (most recent call last):
File "test.py", line 20, in ?
daten.einf(u"te�st","test")
File "test.py", line 16, in einf
cursor.execute(a)
File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 146, in execute
query = query.encode(charset)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 29: ordinal not in range(128)
ich habe im forum gesucht aber leider nicht das richtige gefunden.
mfg
gerhard rogen
Verfasst: Samstag 25. November 2006, 18:44
von sape
Du musst die strings als unicode einfügen in SQLite. Hatte damals auch das Problem. Speichern tut er es erstmal so, aber wenn man dann die Daten von der DB lesen will meckert die SQL-Funktionen.
Moment ich kuck mal kurz wie ich das gemacht habe.
EDIT: Finde die Source nicht (ist glaube ich schon wider in Müll gelandet)
Probiere ein u vor "zu setzen.
Wenn du später die Daten von einer Datei einliest und sie in die DB einfügen willst musst du mit '.encode()' oder '.decode()' arbeiten oder du öffnest die Datei mi 'codecs.open(DATEINAME, MODUS, CODEC)' statt 'file()'. (Die Datei muss aber im richtigen Codec gespeichert sein.)
Verfasst: Samstag 25. November 2006, 19:11
von rogen
das mit dem u funktioniert leider nicht.
komisch ist, dass es unter suse10.1 funktioniert hat.
mfg
Re: mysql und umlaute -- ubuntu
Verfasst: Samstag 25. November 2006, 19:12
von gerold
rogen hat geschrieben:wie bekomme ich einen umlaut in die datenbank
Hi Gerhard!
Ich habe kein MySQL installiert, aber ich glaube, so sollte es funktionieren:
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
import MySQLdb
def einf(self, text1, text2):
conn = MySQLdb.connect(host = "localhost", db = "test2", user = "root", passwd = "")
cur = conn.cursor()
sql = "INSERT INTO test VALUES (0, ?, ?)"
cur.execute(sql, (text1, text2))
conn.commit()
einf(u"testäöo", u"test")
mfg
Gerold

Verfasst: Samstag 25. November 2006, 19:32
von rogen
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
import MySQLdb
def einf(text1, text2):
conn = MySQLdb.connect(host = "localhost", db = "test2", user = "root", passwd = "")
cur = conn.cursor()
sql = "INSERT INTO test VALUES (0, ?, ?)"
cur.execute(sql, (text1, text2))
conn.commit()
einf(u"testäöo", u"test")
kommt:
rogen@rogen-desktop:~$ python test.py
Traceback (most recent call last):
File "test.py", line 16, in ?
einf(u"test��o", u"test")
File "test.py", line 12, in einf
cur.execute(sql, (text1, text2))
File "/usr/lib/python2.4/site-packages/MySQLdb/cursors.py", line 148, in execute
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
rogen@rogen-desktop:~$
Verfasst: Samstag 25. November 2006, 20:36
von BlackJack
Dann ersetz die '?' durch '%s'.
Verfasst: Samstag 25. November 2006, 20:51
von rogen
das war es.
vielen dank
gerhard rogen
Verfasst: Samstag 25. November 2006, 21:26
von Y0Gi
Dein erster Ansatz war, das SQL-Query mittels einfacher %-Formatierung zu bauen. Das ist aber ausdrücklich *nicht* zu tun, da es eben u.a. solche automatischen Umlaut-Encoding-Geschichten nicht ermöglicht, aber andererseits Angriffen durch SQL-Injection Tür und Tor öffnet.
Deshalb sieht
PEP 249: Python Database API Specification v2.0 vor, dass die Methoden den Query mit Platzhaltern sowie die Parameter als separates Argument entgegen nehmen sollen. Leider kann jede Implementierung das Aussehen der Platzhalter selbst wählen, bei MySQLdb ist dies, wie richtig genannt wurde, '%s' - bitte genau aufpassen und nicht mit der normalen %-Formatierung verwechseln!
XtraNine: Wie kommst du bitte auf SQLite, wo es doch ganz offentsichtlich um MySQL geht?

Verfasst: Samstag 25. November 2006, 22:07
von sape
Y0Gi hat geschrieben:[...]
XtraNine: Wie kommst du bitte auf SQLite, wo es doch ganz offentsichtlich um MySQL geht?

Ja ne hast schon recht. Ich hatte damals halt das gleiche Problem aber mit SQLite

Naja, MySQL, SQLite,... ist doch alles der gleiche Käse *gg
Verfasst: Sonntag 26. November 2006, 11:27
von geraldf
Hallo allerseits,
beim Thema "Umlaute" spielt die Version von MySQLdb eine Rolle.
Siehe auch
http://www.python-forum.de/topic-8002.html