【发布时间】: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;