当我尝试通过django
admin:
在/ admin / competition / sport / add /的OperationalError (1366,“不正确的字符串值:'\ xC4 \ x9F \ xC3 \ xBC'用于第1行的'object_repr'列”) 请求方法:POST 请求网址:http://127.0.0.1:8000/admin/competition/sport/add/ Django版本:1.11.4 异常类型:OperationalError 例外价值:
(1366,“错误的字符串值:'\ xC4 \ x9F \ xC3 \ xBC'用于第1行的'object_repr'列'”
以下是模型:
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;"
},
我更新了所有表格和列以使用here所述的utf8mb4
到目前为止,没有任何工作。当我尝试使用mysql
shell插入包含unicode字符的记录时,我没有收到任何错误,但django
admin给出了上述错误。
修改
有趣的是,当我尝试手动插入记录时,下面的代码工作正常:
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;
然后一切正常。
答案 0 :(得分:2)
您必须修改django_admin_log字符集
ALTER TABLE django_admin_log CHANGE object_repr object_repr VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
答案 1 :(得分:0)
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'))),无需进行任何其他设置或数据库更改