MySQL 8.0 中仅修改配置文件无法自动更新已有库、表、列的 COLLATION,必须逐层执行 ALTER 操作,否则 FIND_IN_SET、JOIN 等操作会报 ERROR 1267;需通过 INFORMATION_SCHEMA 查询实际 COLLATION 并按库→表→列顺序执行 ALTER DATABASE、CONVERT TO、MODIFY COLUMN。

MySQL 8.0 中不能只改配置文件就完成排序规则切换,已有库、表、列的 COLLATION 不会自动更新,必须逐层执行 ALTER 操作,否则 FIND_IN_SET、JOIN、子查询等操作会直接报 ERROR 1267。
查清哪些对象还在用旧排序规则
别信建表语句或 phpMyAdmin 界面显示,得查 INFORMATION_SCHEMA 实际值:
- 查所有非
utf8mb4_0900_ai_ci的列:SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND COLLATION_NAME NOT IN ('utf8mb4_0900_ai_ci'); - 查表级排序规则:
SHOW CREATE TABLE your_table;(看DEFAULT COLLATE是否显式写了旧值) - 查库级默认值:
SHOW CREATE DATABASE your_db; - 确认服务端当前默认:
SELECT @@collation_database, @@collation_server;
分层执行 ALTER:库 → 表 → 列
顺序不能错,否则部分字段可能被跳过;CONVERT TO 和 MODIFY 的作用完全不同:
- 改库:
ALTER DATABASE `your_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;(仅影响新表,不改已有表) - 改表(含所有字符列):
ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;(这是关键一步,CONVERT TO会重写所有VARCHAR/TEXT字段的COLLATION) - 单独修某列(如果它被显式指定过旧规则):
ALTER TABLE `table_name` MODIFY `column_name` VARCHAR(255) COLLATE utf8mb4_0900_ai_ci;(注意保留原类型、长度、NOT NULL等属性)
跨版本导入时遇到 Unknown collation 错误
从 MySQL 5.7 或更早导出的 SQL,在 8.0 导入常卡在:Unknown collation: 'utf8mb4_unicode_520_ci' 或 COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4':
- 根本原因是 dump 文件里硬编码了旧排序规则,MySQL 8.0 不认
- 必须在导入前文本替换:把所有
utf8mb4_unicode_520_ci、utf8mb4_general_ci、utf8mb4_unicode_ci替换为utf8mb4_0900_ai_ci - 特别注意
CREATE DATABASE语句里的COLLATE子句,以及每个CREATE TABLE末尾的COLLATE - 用
sed -i 's/utf8mb4_unicode_520_ci/utf8mb4_0900_ai_ci/g' dump.sql快速处理(Linux/macOS)
中文拼音排序要额外指定 utf8mb4_zh_0900_as_cs
MySQL 8.0 默认的 utf8mb4_0900_ai_ci 是通用 Unicode 排序,对中文只是按码点排,不是按拼音——所以 ORDER BY name 结果看起来“乱序”:
- 若需真正按拼音排序,得用专用规则:
utf8mb4_zh_0900_as_cs(区分大小写 + 重音敏感,适配中文) - 改列时指定:
ALTER TABLE `table_name` MODIFY `name` VARCHAR(100) COLLATE utf8mb4_zh_0900_as_cs; - 查询时临时生效:
SELECT * FROM table_name ORDER BY name COLLATE utf8mb4_zh_0900_as_cs; - 注意:该规则仅 MySQL 8.0.30+ 原生支持,低版本需手动编译或降级处理
最易被忽略的是:即使所有对象都改完了,客户端连接仍可能用错字符集——务必检查 my.cnf 中 [client] 和 [mysql] 段是否也设了 default-character-set = utf8mb4,否则 mysql -u 命令行插入 emoji 还是会变问号。


















