Wagtail 5.0.3升级至5.1.3失败:MariaDB排序规则冲突报错
问题原因分析
这个错误是数据库排序规则(collation)不兼容导致的:现有数据库/表使用utf8_general_ci排序规则,而Wagtail 5.1.3的迁移脚本中创建的新字段或执行的查询使用了utf8_unicode_ci,两种规则在执行等值比较时触发MariaDB的Illegal mix of collations冲突。
Wagtail 5.1.x版本在核心表的迁移逻辑中调整了字符集/排序规则的默认配置,而你从5.0.3升级后,旧表的排序规则与新版本要求不统一,因此迁移时出现冲突。
解决步骤
1. 统一数据库全局排序规则
先将数据库默认排序规则统一为utf8_unicode_ci(推荐使用,排序逻辑更准确),执行以下SQL:
ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;
替换your_database_name为你的实际数据库名称。
2. 统一Wagtail核心表的排序规则
针对所有wagtailcore_开头的表,修改表及所有字符类型字段的排序规则:
-- 修改wagtailcore核心表示例,需覆盖所有wagtailcore相关表 ALTER TABLE wagtailcore_page CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE wagtailcore_site CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE wagtailcore_collection CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE wagtailcore_pagerevision CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
如果不确定所有wagtailcore表,可先执行以下SQL查询列表:
SHOW TABLES LIKE 'wagtailcore_%';
3. 调整Django数据库配置
在项目settings.py的数据库配置中,指定统一的排序规则,避免后续创建新表时再次出现不一致:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_database_name', 'USER': 'your_db_user', 'PASSWORD': 'your_db_password', 'HOST': 'localhost', 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8', 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'; SET collation_connection = 'utf8_unicode_ci'", }, } }
4. 重新执行迁移
完成上述修改后,重新运行迁移命令:
python3 manage.py migrate wagtailcore
额外注意事项
- 操作数据库前务必备份数据,避免意外导致数据丢失。
- 若项目中存在非Wagtail表,建议也统一排序规则,防止后续操作出现类似冲突。
- 你的Django 3.2版本符合Wagtail 5.1.x的版本要求,无需调整Django版本。
内容的提问来源于stack exchange,提问作者Philipp S.
相关产品推荐
相关产品推荐

