Erzwinge Spaltencodierung mit sqlalchemy

8

Ich verwende sqlalchemy um das Schema meiner Datenbank zu erstellen. Ich habe keinen Erfolg bei der Durchsetzung der Verwendung von UTF-8, egal was ich versuchte.

Hier ist ein minimales Python-Skript, das mein Problem neu erstellt:

%Vor%

Nach dem Ausführen dieses Skripts, wenn ich in die Datenbank schaue, sehe ich, dass die Kodierung latin1 statt utf-8 ist:

%Vor%

Ich habe versucht, den Typ der erstellten Spalte zu ändern ( String anstelle von Unicode ) und habe versucht, auch das Argument encoding="utf8" im Aufruf zu create_engine , aber nichts davon hat funktioniert.

Also, meine Frage ist:

Wie erzwinge ich die Verwendung einer bestimmten Zeichencodierung (in meinem Fall utf-8) in MySQL mit sqlalchemy?

Danke:)

Anmerkungen:

Ich benutze sqlalchemy 0.7 und python 2.7; Ich kann möglicherweise einen oder beide aufwerten, aber nur wenn es die einzige Lösung ist!

Ich habe mysql 5 und es unterstützt utf-8:

%Vor%     
Jealie 01.09.2013, 17:49
quelle

2 Antworten

12

Verwenden Sie die collation , um eine bestimmte Sortierung pro Spalte anzugeben. Parameter für den Datentyp:

%Vor%

Beachten Sie, dass MySQL dies sowohl als Menge von Codepunkten versteht, die den Text beschreiben, als auch als Sortierreihenfolge, mit der der Text indiziert wird; die üblichen Verdächtigen wie 'utf8' oder 'utf-8' sind MySQL nicht bekannt (benutze SHOW COLLATION , um die vollständige Liste zu sehen)

%Vor%     
SingleNegationElimination 01.09.2013, 18:17
quelle
0

Für mich funktionierte der Sortierparameter nicht.

Meine Verbindungszeichenfolge war:

db = create_engine('mysql+pymysql://user:pass@dbhost/schema?charset=utf8')

Pymysql führte Satznamen utf8 wegen des Zeichensatzes aus, und die Datenbank wandelte den utf8 in die Codierung der Tabelle um, was zu Datenverlust führte.

Wenn ich den Zeichensatz ausließ, war der Zeichensatz auf latin1 voreingestellt, und pymysql versuchte, meine utf8-Zeichenfolgen nach latin1 zu codieren, bevor er sie an die Datenbank schickte, wodurch UnicodeEncode-Fehler ausgelöst wurden.

Das hat bei mir funktioniert: session.execute(text("SET NAMES latin1")) Damit die Datenbank die utf8-Strings übernimmt, die ich gesendet habe, musste sie nicht konvertiert werden.

    
Valnick 31.07.2015 08:05
quelle