MySQL:如何更新session_variables中的collation_database变量?
解决MySQL 8.0会话变量collation_database无法修改的问题
核心原因说明
performance_schema.session_variables是只读监控表,不允许直接UPDATE修改,哪怕root用户也没有权限,这是MySQL的设计规则,该表仅用于查看会话变量状态。collation_database会话变量的值并非通过SET SESSION直接设置生效,它是当前默认数据库的排序规则的镜像值——当你切换或使用某个数据库时,这个变量会自动同步该数据库本身的排序规则,手动执行SET SESSION collation_database = ...不会产生实际效果。
具体解决步骤
1. 检查当前默认数据库的排序规则
先确认你当前会话使用的数据库:
SELECT DATABASE();
再查询该数据库的排序规则:
SELECT collation_name FROM information_schema.schemata WHERE schema_name = '你的数据库名称';
如果结果是utf8mb3_general_ci,说明问题出在数据库本身的排序规则设置上。
2. 修改数据库的排序规则
执行以下语句修改目标数据库的字符集和排序规则:
ALTER DATABASE 你的数据库名称 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
3. 同步会话变量
修改数据库后,你需要:
- 关闭当前会话,重新连接MySQL;
- 或者在当前会话中重新执行
USE 你的数据库名称;,此时collation_database会自动同步为数据库的新排序规则utf8mb4_0900_ai_ci。
4. 全局配置持久化(可选)
为了让新创建的数据库默认使用utf8mb4字符集,修改MySQL配置文件(my.cnf或my.ini),在[mysqld]段添加:
character-set-server=utf8mb4 collation-server=utf8mb4_0900_ai_ci
保存后重启MySQL服务,后续新创建的数据库和会话都会默认使用该配置。
5. 修改现有表和列的字符集(可选)
注意:修改数据库的排序规则不会自动更新现有表和列的设置,若需要统一所有表的字符集,需逐个执行:
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
内容的提问来源于stack exchange,提问作者peppy
相关产品推荐
相关产品推荐

