Django - (1366, "Incorrect string value:... error

5

当我尝试通过 django 管理界面添加新记录时,出现了以下错误:

OperationalError at /admin/competition/sport/add/ (1366, "Incorrect string value: '\xC4\x9F\xC3\xBC' for column 'object_repr' at row 1") Request Method: POST Request URL: http://127.0.0.1:8000/admin/competition/sport/add/ Django Version: 1.11.4 Exception Type: OperationalError Exception Value:
(1366, "Incorrect string value: '\xC4\x9F\xC3\xBC' for column 'object_repr' at row 1")

这是数据模型:

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

以下是我的 settings.py 中针对 mysql 后端的选项:

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

我已经按照这里所述的更新了所有表和列,使用了utf8mb4编码。
到目前为止,没有任何进展。当我尝试使用mysql shell插入包含Unicode字符的记录时,不会出现错误,但是django管理页面会显示上述错误。
有趣的是,当我手动插入记录时,下面的代码可以完美运行:
Sport(is_team=True, name="ÜĞüiğÇÖ").save()

我忘了提到这个项目是在django1.11、python3.6和mysql 5.7.18上运行的。 - zeynel
请勿使用utf8,而应改用utf8mb4 - ospider
我使用了上面建议的类似方法,它有效。 ALTER TABLE CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;``` - Emily
4个回答

6

您需要修改django_admin_log的字符集

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

0

我建立了我的自定义字段来处理数据的编码和解码,而不是在数据库层面上进行处理。

class BaseEmojiField:
    def to_python(self, value ):
        if isinstance(value, str) or value is None:
            if value is None:
                return value
            else:
                encoded_string = str(value).encode('unicode_escape')
                return encoded_string
        return str(value)
    
    def from_db_value(self, value, *args, **kwargs):
        if str(value).startswith("b'"):
            value = bytes(str(value).replace("b'","")[0:-1].replace('\\\\','\\'), 'utf-8').decode('unicode_escape')
        elif str(value).isascii():
            value = bytes(str(value), 'utf-8').decode('unicode_escape')
            return value
        return value

然后您可以将其与Charfield和TextField一起使用

class CustomEmojiCharField(BaseEmojiField , models.CharField):
    pass

class CustomEmojiTextField(BaseEmojiField ,models.TextField):
    pass

所以,在需要使用表情符号的地方,使用这些字段代替models.CharField和models.TextField。另外,有一个缺点是,如果您从Django管理站点编辑任何内容,它会进入Django管理日志。管理日志使用str方法检索实例的信息。因此,在str方法中不要使用带有表情符号/特殊字符的字段。


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


-1

我在一个字段中使用了RichTextUploadingField,当我在该字段中输入表情符号时,它会返回错误。我只需删除表情符号,它就可以正常工作!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接