Django 遗留数据库编码
我相信这个问题并不是特别针对django,但因为我在其他关于python和编码的问题中找不到解决办法,所以我决定问问。 我需要在一个用PHP和MySQL做后台的现有网站上添加新功能。我查看了数据库,并为我将要使用的表创建了模型。不过,现有数据有个问题——一半是俄文的,而且(至少我觉得)它是用utf-8编码的。 当我在django的管理后台显示这些数据时,它显示得不太对。
In [52]: p.name
Out[52]: u'\xd0\u02dc\xd0\xb3\xd0\xbe\xd1\u20ac\xd1\u0152 '
In [53]: repr(p.name)
Out[53]: "u'\\xd0\\u02dc\\xd0\\xb3\\xd0\\xbe\\xd1\\u20ac\\xd1\\u0152 '"
在django的管理后台,它显示成这样:
Игорь
对于我来说,编码还是有点神秘,但如果我理解得没错,这些基本上是unicode对象中的utf-8字节。
我的问题是:在django的数据库层面上,有办法解决这个问题吗?我打算更新这些表中的现有内容,并且需要确保现有的PHP前端能够兼容新旧数据。
当我添加这些数据库选项后,数据在管理后台显示得正确,但是,保存数据时却出现了UnicodeEncode错误。
DATABASE_OPTIONS = {
'charset': 'latin1',
'use_unicode': False,
}
在这种情况下返回的名称是:
In [2]: p2.name
Out[2]: '\xd0\x9b\xd0\xae\xd0\xa1\xd0\xaf'
我查过utf-8字符表,发现这些都是存储在那一行中的正确字符。
2 个回答
1
检查一下你的mysql连接参数。另外,你可以指定DATABASE_OPTIONS:
DATABASE_OPTIONS = {
"charset": "utf8",
"init_command": "SET storage_engine=InnoDB",
}
不过要确认一下它是否真的是utf-8格式。同时要注意,连接和服务器的编码必须保持一致。
1
其实这个问题是因为数据库之前的字符集和排序规则设置成了latin1,而插入的数据却是用utf-8字符集的。解决这个问题的方法是先用latin1字符集导出数据,然后把所有的latin1替换成utf8,最后再把数据导入回来。这个回答详细说明了怎么操作:MySQL将latin1数据转换为UTF8