当数据库字符集已设置为utf8mb4时,发生Django utf8 DatabaseError

时间:2018-08-16 01:34:42

标签: mysql django

每次我编辑带有字符串属性的模型然后迁移时,都会出现错误。但是数据库及其表的字符集已经设置为utf8mb4。例如,我想在“作者”字段中添加“ related_name”,则发生错误。

class Book(models.Model):

    title = models.CharField(max_length=255)

    pub_date = models.DateField()

    publisher = models.CharField(max_length=255)

    language = models.CharField(max_length=255)

    print_length = models.DecimalField(max_digits=6, decimal_places=0)

    price = models.DecimalField(max_digits=10, decimal_places=2)

    authors = models.ManyToManyField(Author, related_name='by')


    def __str__(self):
        return self.title

错误:

django.db.utils.DatabaseError: (3719, "3719: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.", None)

数据库状态:

mysql> show create database eShop;
+----------+----------------------------------------------------------------------------------------------+
| Database | Create Database                                                                              |
+----------+----------------------------------------------------------------------------------------------+
| eShop    | CREATE DATABASE `eShop` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ |
+----------+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

建议使用utf8mb4。当utf8从utf8mb3更改为utf8mb4时,它将避免混淆。

更新

在OPTIONS中设置'CHARSET'的同时,似乎还需要进行其他更改。

使用utf8,InnoDB表中的索引不能超过255个字符,而使用utf8mb4时,索引不能超过191个字符。这意味着Django为CharField(max_length = 255)创建的默认索引太长,可能会破坏事情。

如果现在将VARCHAR长度设置为255,则需要将其更新为小于191的长度。


现在,mysql每个字符保留3个字节的编码UTF-8(UTF8MB3),但是您可以使用UTF8MB4强制它保留4个字节。 'utf-8'的未来默认值为UTF8MB4。因此,建议考虑警告并进行更改。

要解决此问题,请在Django DATABASE设置中使用OPTIONS条目,然后指定要使用的字符集

DATABASES = {
'default': {
    'USER': 'xxxxx',
    'PASSWORD': 'xxxxx',
    'HOST': 'localhost',
    'OPTIONS': {
        'charset': 'utf8mb4',  # The characterset you need
    }
  }
}