如何在Django中设置表字符列的编码?
我有一个用Django写的项目。所有应该存储字符串的字段都应该是UTF-8编码的,但是当我运行
manage.py syncdb
时,所有相关的列却是用cp1252字符集创建的(我也不知道它是怎么变成这样的),我不得不手动更新每一列...
有没有办法告诉Django在一开始就用UTF-8编码来创建这些列呢?
顺便说一下,我使用的是MySQL。
3 个回答
2
你的MySQL编码设置是什么?
比如,你可以在命令行中试试下面的命令:
mysqld --verbose --help | grep character-set
如果输出的不是utf8,那你就需要在my.cnf文件中进行设置:
[mysqld]
character-set-server=utf8
default-collation=utf8_unicode_ci
[client]
default-character-set=utf8
这个页面有更多的信息:
4
Django的数据库后端会自动处理Unicode字符串,把它们转换成合适的编码,然后与数据库进行交流。你不需要告诉Django你的数据库使用什么编码,它会根据你数据库的编码来处理。
我没有看到有什么方法可以让Django创建一个使用特定编码的列。在我看来,之前的MySQL配置对你有影响。即使你手动为所有列设置编码,也请使用这些。
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]
21
Django在创建表的时候并没有指定字符集和排序规则。这些都是由数据库的字符集来决定的。在运行syncdb
之前,先执行ALTER DATABASE ... CHARACTER SET utf8 COLLATE utf8_general_ci
这个命令,可以帮助你设置好字符集和排序规则。
在连接数据库时,Django会自动执行SET NAMES utf8
,所以你不需要担心默认的连接字符集设置。