Seite 1 von 1

Mysqldb Probleme mit Umlauten

Verfasst: Montag 30. Juni 2008, 10:01
von Fintan
Hallo,
ich hab Probleme mit den Umlauten beim Auslesen aus einer Datenbank mit dem MysqlDB Modul.

Folgendes ist eingestellt:
Datenbank hat latin1_bin
Daten wurden mit diesem Python Script eingefügt (vorgabe, Zeichensatz: ANSI, hab das Array All_o aber ein bisschen wegen Übersichtlichkeit gekürzt):

Code: Alles auswählen

# coding=latin-1

import MySQLdb

All_o = [
     ["Baden-Württemberg"
       ,["Basel (Schweiz)", "Basel Badischer Bahnhof"]
       ,["Heidelberg", "Heidelberg Karlstor"]
       ,["Kappel-Gutachbrücke", "Bahnhof Kappel-Gutachbrücke"]
       ,["Karlsruhe", "Karlsruhe Hauptbahnhof"]
       ,["Mannheim", "Mannheimer Hauptbahnhof"]
       ,["Offenburg", "Bahnhof Offenburg"]
       ,["Schorndorf", "Bahnhof Schorndorf"]
       ,["St. Georgen im Schwarzwald", "Bahnhof Sankt Georgen im Schwarzwald"]
       ,["Stuttgart", "Stuttgart Hauptbahnhof"]
       ,["Süßen", "Bahnhof Süßen"]
       ,["Tuttlingen", "Bahnhof Tuttlingen"]

   ],["Bayern"

       ,["Allersberg", "Bahnhof Allersberg (Rothsee)"]
       ,["Aschaffenburg", "Aschaffenburg Hbf"]
       ,["Augsburg", "Augsburg Hbf"]
       ,["Bayerisch Eisenstein", "Bahnhof Bayerisch Eisenstein"]
       ,["Coburg", "Bahnhof Coburg, Bahnhöfe in Coburg"]
       ,["Fürth", "Fürth (Bay) Hbf"]
       ,["Hof (Saale)", "Hof Hbf"]
       ,["Marktredwitz", "Bahnhof Marktredwitz"]
       ,["Ismaning", "Bahnhof Ismaning"]
       ,["Kinding", "Bahnhof Kinding (Altmühltal)"]
       ,["München", "München Hbf"]
       ,["Nürnberg", "Nürnberg Hbf"]
       ,["Passau", "Passau Hbf"]
       ,["Plattling", "Bahnhof Plattling"]
       ,["Postbauer-Heng", "Bahnhof Postbauer-Heng"]
       ,["Regensburg", "Regensburg Hbf"]
       ,["Würzburg", "Würzburg Hbf"]
       ,["Zwiesel", "Bahnhof Zwiesel"]

   ]
]

Database_o = MySQLdb.connect(user="root", passwd="", db="web2008")
Cursor_o   = Database_o.cursor()
for LRow in All_o:
   Land_s = LRow[0]
   for SRow in LRow[1:]:
      Cmd_s = "INSERT INTO bahnhoefe (bundesland, stadt, bahnhof) VALUES ('"+Land_s+"', '"+SRow[0]+"', '"+SRow[1]+"')"
      Cursor_o.execute(Cmd_s)
Database_o.commit()
Danach stehen die Daten auch richtig mit Umlauten in der Datenbank.
Jetzt will ich die Daten wie folgt auslesen:

Code: Alles auswählen

db=_mysql.connect("localhost","root","","web2008") 
db.query("SELECT bundesland FROM bahnhoefe group by bundesland;") 
res=db.use_result() 
rows=res.fetch_row(99) 
arr_json = '['
for row in range(len(rows)):
    print type(rows[row])
    if row>0:
        arr_json += ',"%s"'%rows[row]
    else:
        arr_json += '"%s"'%rows[row]
arr_json += ']'
return arr_json
Das Coding habe ich wie beim Insert script auf # coding=latin-1 gesetzt und mit Zeichensatz ANSI gespeichert, bei type sagt er mir type 'tuple'.

Was muss ich jetzt einstellen damit die Umlaute angezeigt werden?
Das Datenbankencoding auf UTF-8 einstellen? Oder mache ich da was beim Auslesen falsch?

Verfasst: Montag 30. Juni 2008, 10:08
von Pekh
MySQL und Encoding ist so eine Sache ... Es ist nicht so wichtig, welches Encoding die Tabelle hat, aber du solltest ihm unbedingt mitteilen, welches Encoding du für die Verbindung nutzen möchtest. Hierzu kannst du entweder bei der Erstellung der Verbindung einen zusätzlichen Parameter mitgeben, oder ganz zu Beginn einen SQL-Befehl "SET NAMES ..." absetzen.

Bei beiden Lösungen ist mir die genaue Syntax jetzt nicht geläufig, aber wenn du danach googlest, solltest du fündig werden.

Verfasst: Montag 30. Juni 2008, 11:37
von jens
siehe: [wiki]MySQLdb troubleshooting#Unicoderger[/wiki]

Verfasst: Montag 30. Juni 2008, 13:00
von Leonidas
Und bitte die SQL-Queries nicht selbst zusammensetzen (siehe Parametrisierte SQL-Queries im Wiki).

Verfasst: Freitag 18. Juli 2008, 16:05
von skymuss
---------------------

Verfasst: Freitag 18. Juli 2008, 16:06
von jens
Schau mal hier: [wiki]Easy Install[/wiki]

Verfasst: Freitag 18. Juli 2008, 17:37
von BlackJack
@Fintan: Bitte lass den Quatsch mit den `_o` bei den Namen. Das ist ja scheusslich. In Python ist alles, was man an einen Namen binden kann, ein Objekt. Das Offensichtliche braucht man nicht noch einmal durch so einen überflüssigen Postfix sagen.

Ausserdem werden nach Style-Guide Namen für Variablen und Funktionen klein_und_mit_unterstrichen geschrieben. Damit kann man sie prima von Klassen unterscheiden, die in "CamlCase" geschrieben werden.

Das in den inneren Listen das erste Element eine andere Bedeutung hat, als der Rest, ist stilistisch nicht so schön.

Für `LRow` und `SRow` lassen sich sicher sprechendere Namen finden. `SRow` könnte man auch gleich in der Schleife auf zwei Namen "entpacken", dann spart man sich die Indexzugriffe auf Stadt und Bahnhof.

Für's JSON würde ich ein entsprechendes Modul empfehlen. Oder zumindest die `join()`-Methode von Zeichenketten verwenden um die Kommata zwischen die Einträge zu bringen.

Wobei ich mir nicht so ganz sicher bin, ob das JSON wirklich so aussehen soll!?