Django遗留数据库编码

时间:2010-02-15 16:17:23

标签: python django encoding

我确定这个问题不是django特有的,但由于我在其他关于python和编码的问题中找不到任何解决方案,我会问这个问题。 我需要为使用MySQL作为后端的PHP编写的现有网站添加新功能。我检查了数据库并为我要使用的表创建了模型。然而,现有数据存在问题 - 其中一半是俄语,并且(至少在我看来)它采用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 admin中,它显示如下:

Игорь

编码对我来说仍然有点神话般,但如果我正确理解了这个输出,那么在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 个答案:

答案 0 :(得分:1)

检查你的mysql连接参数。此外,您可以指定DATABASE_OPTIONS:

DATABASE_OPTIONS = {
    "charset": "utf8",
    "init_command": "SET storage_engine=InnoDB",
}

但请查看它是否真的是utf-8。另请注意,连接和服务器编码必须同步。

答案 1 :(得分:1)

实际上这个问题是数据库之前的字符集和整理 - 它是latin1,但数据是使用utf-8字符集插入的。它是通过使用latin1 charset导出数据,用utf8替换所有出现的latin1并再次导入数据来解决的。这个答案显示了如何执行此操作:MySQL Convert latin1 data to UTF8