【问题标题】:Django - (1366, "Incorrect string value:... errorDjango - (1366,“不正确的字符串值:...错误
【发布时间】:2020-06-07 04:55:02
【问题描述】:

当我尝试通过django admin 添加新记录时出现以下错误:

/admin/competition/sport/add/ 处的操作错误 (1366,“不正确的字符串值:第 1 行的列 'object_repr' 的 '\xC4\x9F\xC3\xBC'”) 请求方法:POST 请求网址:http://127.0.0.1:8000/admin/competition/sport/add/ Django 版本:1.11.4 异常类型:操作错误 异常值:
(1366,“不正确的字符串值:第 1 行的列 'object_repr' 的 '\xC4\x9F\xC3\xBC'”)

这是模型:

class Sport(models.Model):
    is_team = models.BooleanField(_("Is Team"))
    name = models.CharField(_("Name"), max_length=200)

mysql 后端的选项在我的settings.py

'OPTIONS': {
        'charset': 'utf8mb4',
        'init_command': 'SET character_set_connection=utf8mb4;'
                        'SET collation_connection=utf8mb4_unicode_ci;'
                        "SET NAMES 'utf8mb4';"
                        "SET CHARACTER SET utf8mb4;"
    },

我已更新所有表格和列以使用 utf8mb4,如 here 所述

到目前为止没有任何效果。当我尝试使用 mysql shell 插入包含 unicode 字符的记录时,我没有收到任何错误,但 django 管理员给出了上述错误。

编辑:

有趣的是,当我尝试手动插入记录时,下面的代码可以完美运行:

Sport(is_team=True, name="ÜĞüiğÇÖ").save()

编辑 2:

我终于找到了导致问题的原因。 Django 管理员默认记录每个操作(包括数据,在我的例子中是一些奇怪的 unicode 文本)。原来'django_admin_log'表有'latin1'字符集,所以我只是把它转换成utf8:

ALTER TABLE django_admin_log CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

然后一切正常。

【问题讨论】:

  • 我忘了说项目运行在django1.11、python3.6和mysql 5.7.18上
  • 请不要使用utf8,改用utf8mb4
  • 我使用了上面建议的类似方法并且它有效。 ALTER TABLE django_admin_log CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE <ALL_OTHER_TABLES_I_HAVE> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

标签: python mysql django


【解决方案1】:

你必须修改 django_admin_log 字符集

ALTER TABLE django_admin_log CHANGE object_repr object_repr VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

【讨论】:

    【解决方案2】:
    class Employee(models.Model):
            name = models.CharField(max_length=100)
    
            def save(self, *args, **kwargs):
               super(Employee, self).save(*args, **kwargs)
               self.name = str(self.name.encode('unicode_escape'))
               
    

    您需要在保存之前使用 unicode_escape 进行编码,如上例所述(self.name = str(self.name.encode('unicode_escape'))),无需进行任何其他设置或 db 更改

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2015-03-29
      相关资源
      最近更新 更多