每次我编辑带有字符串属性的模型然后迁移时,都会出现错误。但是数据库及其表的字符集已经设置为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)
如何解决此问题?
答案 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
}
}
}