MySQL排序规则需分层配置且三段缺一不可:[mysqld]设character-set-server和collation-server,[client]与[mysql]均设default-character-set=utf8mb4;仅改collation-server对已有库表无效,须逐级修改并重建索引。

为什么只改collation-server不生效
MySQL 的排序规则不是单点开关,而是分层继承:服务器 → 数据库 → 表 → 列 → 查询时字符串字面量。只在 [mysqld] 段设 collation-server = utf8mb4_0900_ai_ci,仅影响新创建的数据库默认值,对已有库、所有表、所有字段完全无作用。更常见的是,你改了配置却在 SHOW CREATE TABLE users; 里看到 COLLATE utf8mb4_unicode_ci——那说明表级定义压倒了服务器级设置。
my.cnf 必须同时配三段,且顺序不能错
Linux 下编辑 /etc/mysql/my.cnf(或 /etc/my.cnf),Windows 是 C:\ProgramData\MySQL\MySQL Server X.X\my.ini,Docker 必须挂载到 /etc/mysql/my.cnf 并确保权限为 644。以下三段缺一不可:
-
[mysqld]:加character-set-server = utf8mb4和collation-server = utf8mb4_0900_ai_ci -
[client]:加default-character-set = utf8mb4(控制mysqldump、mysqladmin等工具) -
[mysql]:加default-character-set = utf8mb4(专用于mysql命令行客户端,否则连上后character_set_client仍是latin1)
写进 [mysqld_safe] 或拼错段名(如 [mysqld] 写成 [mysql]),配置会被静默忽略。
验证必须查全四个连接变量,不能只看 server
重启 MySQL 后,用 mysql -h 127.0.0.1 -u root -p 连(避免 socket 跳过 [client] 段),执行:
SHOW VARIABLES LIKE 'character\_set%';
必须全部满足:
character_set_client = utf8mb4character_set_connection = utf8mb4character_set_results = utf8mb4character_set_server = utf8mb4
任一值是 utf8 或 latin1,就说明某段配置没加载,或被其他同名配置文件覆盖(比如宝塔用户可能同时存在 /www/server/mysql/etc/my.cnf 和 /etc/mysql/my.cnf)。
已有表不会自动升级,CONVERT TO 要小心锁表
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; 只改数据库默认值,不影响已有表。真正生效要靠:
- 改表:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;—— 会重写整张表、重建索引,大表操作期间表被锁 - 改列(更精准):
ALTER TABLE tbl_name MODIFY COLUMN name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;—— 必须重复声明完整类型,漏写VARCHAR(255)会导致字段变TEXT或丢失长度限制
特别注意:索引不会自动适配新排序规则。执行 SHOW INDEX FROM tbl_name;,检查 Collation 列是否为 A;如果是 NULL 或 D,需手动重建索引,否则 WHERE name = 'café' 可能走全表扫描。


















