【问题标题】:Django legacy database encodingDjango 遗留数据库编码
【发布时间】:2011-01-17 01:22:22
【问题描述】:

我确定这个问题不是 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 字符表,对于存储在该行中的数据,这些字符是正确的。

【问题讨论】:

    标签: python django encoding


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      实际上这个问题是数据库之前的字符集和排序规则——它是 latin1,但是数据是使用 utf-8 字符集插入的。通过使用 latin1 字符集导出数据,用 utf8 替换所有出现的 latin1 并再次导入数据来解决此问题。这个答案显示了如何做到这一点:MySQL Convert latin1 data to UTF8

      【讨论】:

        猜你喜欢
        • 2013-08-07
        • 2016-02-15
        • 2021-08-26
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 2011-11-21
        相关资源
        最近更新 更多