Skip to content

START-DB-COLLATION-MIXED

错误编号:START-DB-COLLATION-MIXED

Java 错误 Manifest 尚未从 unified-error-diagnostics 导出。本页是 Spec 指定的第一条端到端规范答案。HTTP 响应目前仍是 RespInfocode / message / data / timestamp,还没有运行时 errorKey

适用版本 / 权益

  • 免费文档。基础设施错误不藏在 Docs PRO 后面。
  • MySQL 8.0+utf8mb4_0900_ai_ci 是 8.0 的默认排序规则,MySQL 5.7 不支持。
  • 新环境初始化,或历史库出现 Illegal mix of collations

典型报错关键词

  • Illegal mix of collations
  • utf8mb4_0900_ai_ciutf8mb4_unicode_ci / utf8mb4_general_ci 同时出现
  • Flyway 迁移在字符串比较处失败

不要把真实 JDBC URL、账号或业务数据贴到 Issue。

用户会看到什么

  • 启动 Admin 失败,日志里有 collation 混用。
  • 或 Flyway 停在某条含字符串比较的迁移。
  • 控制台将来会打印本错误编号;现在先按关键词回到本页。

发生原因

库默认排序规则、已有表、列或连接会话用的排序规则不一致。MySQL 在 =JOINNOT EXISTS 比较字符串时无法自动决定用哪一种。

forge-server/scripts/db/init-db.sh 建库用的是:

sql
CREATE DATABASE IF NOT EXISTS `<库名>` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER DATABASE `<库名>` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

官方检查脚本 check-collation-consistency.sh 的期望值也是 utf8mb4_0900_ai_ci

配置位置

类型位置键 / 对象期望
COMMANDforge-server/scripts/db/init-db.shCREATE DATABASE / ALTER DATABASEutf8mb4 / utf8mb4_0900_ai_ci
DATABASEMySQL 库、表、字符串列DEFAULT COLLATE / TABLE_COLLATION / COLLATION_NAME与新库一致
YAMLAdmin spring.flyway.tableforge_schema_history不要手改已执行的 V*.sql

正确配置

新环境只跑 init-db.sh,不要再手工导入全量 SQL。库、连接和活动初始化 SQL 统一 utf8mb4 + utf8mb4_0900_ai_ci

解决步骤

  1. 确认是新库还是有数据的历史库。
  2. 新库且没有业务数据:删库重建后再跑 init-db.sh,然后启动 Admin 让 Flyway 重新迁移。
  3. 历史库有数据:先完整备份,再开维护窗口。由 DBA 评估表和字符列。本文不提供无条件 ALTER TABLE ... CONVERT TO 命令。只改 ALTER DATABASE 不会改已经存在的表和列。
  4. Flyway checksum 失败:先备份。不要为了过校验去改已经执行过的历史 V*.sql 再手工重算 checksum。
  5. information_schema 里看到的 ascii_bin 可能是哈希、令牌列的有意设计,不要按查询结果批量转全部字段。

首次初始化、确认没有业务数据时,才允许:

sql
-- 仅适用于确认没有业务数据的首次初始化环境
DROP DATABASE forge_admin;
CREATE DATABASE forge_admin
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_0900_ai_ci;

库名以你实际使用的为准。

验证方法

sql
SHOW CREATE DATABASE forge_admin;
SELECT DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'forge_admin';

应看到 utf8mb4_0900_ai_ci。也可跑 forge-server/scripts/db/check-collation-consistency.sh

仍未解决时提供的安全信息

  • 本错误编号
  • MySQL 版本(SELECT VERSION();
  • SHOW CREATE DATABASE 的输出(不要带账号密码)
  • Flyway 失败的 version / script 名,不要贴完整 SQL 和连接串

相关文档