2009-07-29 6 views
11

Tengo un proyecto escrito en Django. Todos los campos que se supone que almacenar algunos hilos se supone que son en UTF-8, sin embargo, cuando corro¿Cómo establecer la codificación de las columnas de caracteres de las tablas en django?

manage.py syncdb 

todas las columnas respectivas se crean con el conjunto de caracteres CP1252 (¿de dónde conseguir que - no tengo ni idea) y tengo que actualizar manualmente cada columna ...

¿Hay alguna manera de decirle a Django que cree todas esas columnas con codificación UTF-8 en primer lugar?

BTW, yo uso MySQL.

Respuesta

18

Django no especifica el conjunto de caracteres y la intercalación en las declaraciones CREATE TABLE. Todo está determinado por el conjunto de caracteres de la base de datos. Hacer ALTER DATABASE ... CHARACTER SET utf8 COLLATE utf8_general_ci antes de ejecutar syncdb debería ayudar.

Para la conexión, Django emite SET NAMES utf8 automáticamente, por lo que no tiene que preocuparse por la configuración predeterminada del juego de caracteres de conexión.

+0

Si tiene curiosidad, puede ver 'CREATE TABLE 'Stataments SQL haciendo' ./manage.py sqlall appname'. No tengo un servidor MySQL cerca, pero estoy seguro de que no se especificará ningún conjunto de caracteres/intercalación. Por lo tanto, las intercalaciones se determinarán a partir de la configuración de la base de datos. – drdaeman

+1

Sí, parece hacer el truco, gracias. La codificación cp1252 parece ser un problema de mysqladmin. –

4

Los backends de la base de datos de Django manejan automáticamente cadenas Unicode en la codificación adecuada y hablan con la base de datos. No necesita decirle a Django qué codificación usa su base de datos. Lo maneja bien, mediante el uso de la codificación de la base de datos.

No veo ninguna manera de decirle a django que cree una columna, usando alguna codificación específica. Como me parece, hay absolutamente alguna configuración previa de MySQL que lo afecta. Y a pesar de hacerlo manualmente para todas las columnas, utilícelas.

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

¿Cuál es su codificación MySQL establecida?

Por ejemplo, pruebe lo siguiente desde la línea de comandos:

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

Si no utf8 mensaje, entonces tendrá que ajustar la salida de my.cnf:

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

[client] 
default-character-set=utf8 

Esta página no tiene algo más de información:

+0

Si no me equivoco, Django ya hace 'SET NAMES utf8' en la conexión. – drdaeman

+0

Dice latin1, por lo que cp1252 fue el problema de mysqladmin. Esta configuración que sugiere parece afectar solo al cliente de la línea de comandos –

+0

No, la sección [mysqld] es específicamente para la hora del servidor. Tengo colación predeterminada en mi archivo, pero quizás eso haya cambiado en las versiones. Consulte la sección "Especificar la configuración de caracteres en el inicio del servidor" en esta página: http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html – ars

Cuestiones relacionadas