2009-07-29 6 views
11

Ich habe ein Projekt in Django geschrieben. Alle Felder, die angeblich einige Strings speichern sollen in UTF-8 sein, aber, wenn ichWie legt man die Kodierung für die Char-Spalten der Tabellen in Django fest?

manage.py syncdb 

alle entsprechenden Spalten erstellt werden, mit cp1252 Zeichensatz ausführen (wo hat es, dass bekommen - ich habe keine Idee) und ich muss jede Spalte manuell aktualisieren ...

Gibt es eine Möglichkeit, Django zu sagen, um alle diese Spalten mit UTF-8-Codierung an erster Stelle zu erstellen?

BTW, ich benutze MySQL.

Antwort

18

Django gibt Zeichensatz und Sortierung in CREATE TABLE Anweisungen nicht an. Alles wird vom Datenbank-Zeichensatz bestimmt. Doing ALTER DATABASE ... CHARACTER SET utf8 COLLATE utf8_general_ci vor dem Ausführen syncdb sollte helfen.

Für die Verbindung gibt Django automatisch SET NAMES utf8 aus, so dass Sie sich keine Gedanken über die Standard-Zeichensatzeinstellungen machen müssen.

+0

Wenn Sie neugierig sind, können Sie 'CREATE TABLE sehen 'SQL statuten indem' ./manage.py sqlall appname'. Ich habe keinen MySQL-Server in der Nähe, aber ich bin mir sicher, dass kein Zeichensatz/Sortierung angegeben wird. Die Sortierungen werden aus den Datenbankeinstellungen ermittelt. – drdaeman

+1

Ja, das scheint den Trick zu machen, danke. Das cp1252 Codierung scheint mysqladmin Problem zu sein. –

4

Djangos Datenbank-Backends behandelt Unicode-Zeichenfolgen automatisch in die entsprechende Codierung und kommuniziert mit der Datenbank. Sie müssen Django nicht mitteilen, welche Kodierung Ihre Datenbank verwendet. Es handhabt es gut, indem es die Kodierung der Datenbank benutzt.

Ich sehe keine Möglichkeit, wie Sie Django sagen können, eine Spalte zu erstellen, mit einer bestimmten Codierung. Wie es scheint, gibt es absolut einige vorherige MySQL-Konfiguration, die Sie beeinflussen. Und tun Sie es manuell für alle Spalte, verwenden Sie diese.

CREATE DATABASE db_name 
    [[DEFAULT] CHARACTER SET charset_name] 
    [[DEFAULT] COLLATE collation_name] 

ALTER DATABASE db_name 
    [[DEFAULT] CHARACTER SET charset_name] 
    [[DEFAULT] COLLATE collation_name] 
2

Wofür ist Ihre MySQL-Codierung eingestellt?

Zum Beispiel, versuchen Sie Folgendes in der Befehlszeile:

mysqld --verbose --help | grep character-set 

Wenn es nicht ausgegeben utf8, dann müssen Sie die Ausgabe in my.cnf setzen:

[mysqld] 
character-set-server=utf8 
default-collation=utf8_unicode_ci 

[client] 
default-character-set=utf8 

Diese Seite hat einige weitere Informationen:

+0

Wenn ich mich nicht irre, macht Django bereits 'SET NAMES utf8' auf Verbindung. – drdaeman

+0

Es sagt latin1, also war cp1252 das Problem von mysqladmin. Die von Ihnen vorgeschlagenen Einstellungen scheinen sich nur auf den Befehlszeilenclient auszuwirken. –

+0

Nein, der Abschnitt [mysqld] ist speziell für die Serverzeit vorgesehen. Ich habe eine Standard-Sortierung in meiner Datei, aber das hat sich in Versionen geändert. Siehe den Abschnitt "Zeicheneinstellungen beim Serverstart festlegen" auf dieser Seite: http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html – ars

Verwandte Themen