START-DB-COLLATION-MIXED
错误编号:START-DB-COLLATION-MIXED
Java 错误 Manifest 尚未从 unified-error-diagnostics 导出。本页是 Spec 指定的第一条端到端规范答案。HTTP 响应目前仍是 RespInfo 的 code / 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 collationsutf8mb4_0900_ai_ci与utf8mb4_unicode_ci/utf8mb4_general_ci同时出现- Flyway 迁移在字符串比较处失败
不要把真实 JDBC URL、账号或业务数据贴到 Issue。
用户会看到什么
- 启动 Admin 失败,日志里有 collation 混用。
- 或 Flyway 停在某条含字符串比较的迁移。
- 控制台将来会打印本错误编号;现在先按关键词回到本页。
发生原因
库默认排序规则、已有表、列或连接会话用的排序规则不一致。MySQL 在 =、JOIN、NOT 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。
配置位置
| 类型 | 位置 | 键 / 对象 | 期望 |
|---|---|---|---|
| COMMAND | forge-server/scripts/db/init-db.sh | CREATE DATABASE / ALTER DATABASE | utf8mb4 / utf8mb4_0900_ai_ci |
| DATABASE | MySQL 库、表、字符串列 | DEFAULT COLLATE / TABLE_COLLATION / COLLATION_NAME | 与新库一致 |
| YAML | Admin spring.flyway.table | forge_schema_history | 不要手改已执行的 V*.sql |
正确配置
新环境只跑 init-db.sh,不要再手工导入全量 SQL。库、连接和活动初始化 SQL 统一 utf8mb4 + utf8mb4_0900_ai_ci。
解决步骤
- 确认是新库还是有数据的历史库。
- 新库且没有业务数据:删库重建后再跑
init-db.sh,然后启动 Admin 让 Flyway 重新迁移。 - 历史库有数据:先完整备份,再开维护窗口。由 DBA 评估表和字符列。本文不提供无条件
ALTER TABLE ... CONVERT TO命令。只改ALTER DATABASE不会改已经存在的表和列。 - Flyway checksum 失败:先备份。不要为了过校验去改已经执行过的历史
V*.sql再手工重算 checksum。 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 和连接串
