You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:27:32