Django的遗留数据库编码(Django legacy database encoding)

2019-11-03 03:06发布

我敢肯定,这个问题是不特定于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管理它显示是这样的:

Игорь

编码是对我来说还是有点神话,但如果我正确地理解这个输出,基本上这些都是以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字符表检查,而这些都是存储该行中的数据正确的字符。

Answer 1:

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

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

但是看看它是否真的UTF-8。 还要注意的是连接和服务器编码必须同步。



Answer 2:

其实这个问题是数据库的前一个字符集和collat​​ion-是latin1的,但使用UTF-8字符集插入数据。 它是通过使用LATIN1字符集导出数据,替换为utf8的处理latin1,并再次导入数据出现的所有解决。 这样的回答显示了如何做到这一点: MySQL的转换LATIN1数据UTF8



文章来源: Django legacy database encoding