2009-07-29 4 views
11

J'ai un projet écrit en Django. Tous les champs qui sont censés stocker certaines chaînes sont censées être en UTF-8, cependant, quand je lanceComment définir le codage des colonnes char des tables dans django?

manage.py syncdb 

toutes les colonnes respectives sont créés avec le jeu de caractères CP1252 (où a-il - je ne idée) et je dois mettre à jour manuellement chaque colonne ...

Existe-t-il un moyen de dire à Django de créer toutes ces colonnes avec l'encodage UTF-8 en premier lieu?

BTW, j'utilise MySQL.

Répondre

18

Django ne spécifie pas de charset et de classement dans les instructions CREATE TABLE. Tout est déterminé par le jeu de caractères de la base de données. Faire ALTER DATABASE ... CHARACTER SET utf8 COLLATE utf8_general_ci avant d'exécuter syncdb devrait aider. Pour la connexion, Django émet automatiquement SET NAMES utf8, vous n'avez donc pas à vous soucier des paramètres de jeu de caractères de connexion par défaut.

+0

Si vous êtes curieux, vous pouvez voir 'CREATE TABLE 'Statements SQL en faisant' ./manage.py sqlall appname'. Je n'ai pas de serveur MySQL à proximité, mais je suis sûr qu'il n'y aura pas de charset/classement spécifié. Ainsi, les classements seront déterminés à partir des paramètres de la base de données. – drdaeman

+1

Oui, ça semble faire l'affaire, merci. Le codage cp1252 semble être le problème de mysqladmin. –

4

Les backends de base de données de Django traitent automatiquement les chaînes Unicode dans l'encodage approprié et dialoguent avec la base de données. Vous n'avez pas besoin de dire à Django quel encodage utilise votre base de données. Il gère bien, en utilisant l'encodage de votre base de données.

Je ne vois pas comment vous pouvez dire à django de créer une colonne, en utilisant un encodage spécifique. Comme il me semble, il y a absolument une configuration MySQL précédente qui vous affecte. Et malgré le fait de le faire manuellement pour toutes les colonnes, utilisez-les.

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

À quoi correspond votre encodage MySQL?

Par exemple, essayez ce qui suit de la ligne de commande:

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

Si elle n'a pas UTF8 de sortie, vous devrez régler la sortie en my.cnf:

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

[client] 
default-character-set=utf8 

Cette page a quelques informations supplémentaires:

+0

Si je ne me trompe pas, Django fait déjà 'SET NAMES utf8' sur la connexion. – drdaeman

+0

On dit latin1, donc cp1252 était le problème de mysqladmin. Ces paramètres que vous suggérez ne semblent affecter que le client de ligne de commande –

+0

Non, la section [mysqld] est spécifique à l'heure du serveur. J'ai collation par défaut dans mon fichier, mais peut-être que cela a changé dans les versions. Voir la section "Spécifier les paramètres de caractères au démarrage du serveur" sur cette page: http://dev.mysql.com/doc/refman/5.0/fr/charset-applications.html – ars

Questions connexes