jens hat geschrieben:Die sollte utf-8 sein, weil ich nichts verändert habe. Also default von Django. Ich werde mal versuchen das zu klären.
So (Ausgaben ein wenig verschönert):
Code: Alles auswählen
phpBB2DjangoBB_project$ ./manage.py shell
...
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
...
>>> from django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute("SHOW VARIABLES LIKE %s;", ("char%",))
8L
>>> cursor.fetchall()
((u'character_set_client', u'utf8'),
(u'character_set_connection', u'utf8'),
(u'character_set_database', u'utf8'),
(u'character_set_filesystem', u'binary'),
(u'character_set_results', u'utf8'),
(u'character_set_server', u'latin1'),
(u'character_set_system', u'utf8'),
(u'character_sets_dir', u'/usr/local/pd-admin2/share/mysql/charsets/'))
>>> cursor.execute("SHOW VARIABLES LIKE %s;", ("collation%",))
3L
>>> cursor.fetchall()
((u'collation_connection', u'utf8_general_ci'),
(u'collation_database', u'utf8_unicode_ci'),
(u'collation_server', u'latin1_swedish_ci'))
Ich denke der client kommuniziert also mit
utf-8, doch der server läuft halt mit
latin-1.
Meine Tabellen hab ich ja geändert auf
CHARACTER SET utf8 COLLATE utf8_unicode_ci
Die ganzen Encoding Einstellungen stelle ich mir mal so vor (Bitte korrigiert mich):
* Server: Encoding in dem die Daten letztlich auf Platte gespeichert werden
* Tabelle: Encoding in der Tabelle
* Connection: Encoding mit dem zwischen client und server kommuniziert wird
* Client: Encoding die der client dann letztlich zum "Programm" zurück liefert
Wenn die Encodings unterschiedlich sind, dann muss zwischen den Schichten immer wieder konvertiert werden:
HDD <-> Server <-> Tabelle <-> Connection <-> Client <-> Programm
Bei Unterschiedlichen encodings kann man eigentlich nur Zeichen speichern, die im "kleinsten gemeinsamen Nenner" sind, oder? In meinem Fall: Server läuft mit latin-1 kann man also auch nur Zeichen in latin-1 speichern?
Doch mein vorheriger Fehler
"Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE)...
Könnte man vielleicht so erklären, das Tabelle & Connection zwar mit
'utf8_general_ci' laufen, aber
'collation_server' == 'latin1_swedish_ci' ist.
Wenn das so wäre, macht es doch aber keinen Sinn, das man überhaupt verschiedene Codecs mischen kann.
d.h. Connection/Client/Tabellen Encoding kann ich nur theoretisch einstellen wie ich will. Doch Sinn macht nur latin1, weil vom server festgelet und weil ich somit A eh nur den
latin-1 Zeichenraum nutzten kann und B die collation
latin1_* sein muß...
Ich bin verwirrt.
EDIT: Hier die Werte mit
OPTIONS["charset"] == "latin1":
Code: Alles auswählen
>>> cursor.execute("SHOW VARIABLES LIKE %s;", ("char%",))
8L
>>> cursor.fetchall()
((u'character_set_client', u'latin1'),
(u'character_set_connection', u'latin1'),
(u'character_set_database', u'utf8'),
(u'character_set_filesystem', u'binary'),
(u'character_set_results', u'latin1'),
(u'character_set_server', u'latin1'),
(u'character_set_system', u'utf8'),
(u'character_sets_dir', u'/usr/local/pd-admin2/share/mysql/charsets/'))
>>> cursor.execute("SHOW VARIABLES LIKE %s;", ("collation%",))
3L
>>> cursor.fetchall()
((u'collation_connection', u'latin1_swedish_ci'),
(u'collation_database', u'utf8_unicode_ci'),
(u'collation_server', u'latin1_swedish_ci'))
Ich werde jetzt mal versuchen alle auf latin-1 um zu stellen...