Django - (1366,“不正确的字符串值:...错误

时间:2017-08-13 22:32:38

标签: python mysql django

当我尝试通过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;

然后一切正常。

2 个答案:

答案 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'))),无需进行任何其他设置或数据库更改