Django + MySQL: Encoding...
Verfasst: Mittwoch 12. September 2012, 11:42
Ich möchte gern das Zusammenspiel von Django + MySQL besser verstehen.
Wenn ich das richtig verstehe, geht Django immer davon aus, das der MySQL server mit utf-8 läuft. In dem Falle gibt es keine Probleme. Man bekommt daten in unicode und kann unicode daten wieder in die DB packen.
Doch die Standard Installation von MySQL auf Ubuntu/Debian ist eigentlich mit "latin-1" encoding. Man kann dies leicht ändern, indem man in /etc/mysql/my.cnf das einträgt:
So hab ich es bei meinem Server gemacht.
Doch was muß man tun, damit Django kein Problem mit "latin-1" hat? In der Doku bei https://docs.djangoproject.com/en/dev/r ... e-database steht:
In den Django MySQL sourcen kann man auch sehen, das teilweise "utf-8" hardcoded ist.
Wenn man nicht einfach zugriff auf die MySQL Server Einstellungen hat, was kann man machen?
Bei DATABASE settings gibt es die zusätzlichen connection OPTIONS. Theoretisch sollte das helfen:
Zumindest sehe ich, das sie die MySQL Variablen um charaterset mit der connection ändern. Dennoch bekomme ich SQL Warnings, wie:
Wenn ich das richtig verstehe, geht Django immer davon aus, das der MySQL server mit utf-8 läuft. In dem Falle gibt es keine Probleme. Man bekommt daten in unicode und kann unicode daten wieder in die DB packen.
Doch die Standard Installation von MySQL auf Ubuntu/Debian ist eigentlich mit "latin-1" encoding. Man kann dies leicht ändern, indem man in /etc/mysql/my.cnf das einträgt:
Code: Alles auswählen
character-set-server=utf8
collation-server=utf8_unicode_ci
Doch was muß man tun, damit Django kein Problem mit "latin-1" hat? In der Doku bei https://docs.djangoproject.com/en/dev/r ... e-database steht:
Heißt es also, es geht nur mit UTF-8 oder UTF-16 und alles andere produziert Ärger?Make sure your database is configured to be able to store arbitrary string data. Normally, this means giving it an encoding of UTF-8 or UTF-16. If you use a more restrictive encoding – for example, latin1 (iso8859-1) – you won’t be able to store certain characters in the database, and information will be lost.
In den Django MySQL sourcen kann man auch sehen, das teilweise "utf-8" hardcoded ist.
Wenn man nicht einfach zugriff auf die MySQL Server Einstellungen hat, was kann man machen?
Bei DATABASE settings gibt es die zusätzlichen connection OPTIONS. Theoretisch sollte das helfen:
Code: Alles auswählen
'OPTIONS': {
"use_unicode": True,
"charset": "utf8",
},
Code: Alles auswählen
Warning: Incorrect string value: '\xE2\x9D\x96 [u...' for column 'FooBar' at row 1