mysql 8.0安装前必须预置my.cnf/my.ini配置utf8mb4,否则系统表、日志等底层对象将永久绑定latin1且无法修复;需在client[mysqld]三段设utf8mb4及init_connect,并验证四个character_set变量全为utf8mb4。

MySQL 8.0 安装向导不提供字符集选项,跳过预配置等于默认用 latin1——系统表、日志、performance_schema 等底层对象将永久绑定错误编码,后续无法安全修正。
安装前必须把 my.cnf/my.ini 放到位
Linux 下放到 /etc/my.cnf 或 /etc/mysql/my.cnf;Windows 下放在 MySQL 安装目录(如 C:\Program Files\MySQL\MySQL Server 8.0\my.ini),且文件权限需为 644(Docker 必须挂载到 /etc/mysql/my.cnf)。内容至少包含:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci init_connect = 'SET NAMES utf8mb4'
注意:init_connect 是关键补丁,它让普通用户连接后自动执行 SET NAMES utf8mb4,否则即使服务端设对了,首次会话仍可能回退到旧行为(尤其搭配 caching_sha2_password 认证时)。
别信“默认已是 utf8mb4”,得看实际加载的配置
MySQL 8.0 源码默认值是 utf8mb4,但发行版(宝塔、phpEnv、Docker 官方镜像、Windows MSI)普遍沿用旧模板,my.cnf 里没写就等于没启用。常见表现:
-
SHOW VARIABLES LIKE 'character_set_server';返回utf8(即utf8mb3)或latin1 - 新建数据库后执行
SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='test';结果不是utf8mb4 - 插入 emoji 报错
Incorrect string value: '\xF0\x9F\x98\x80'
验证必须覆盖四个变量和 init_connect 生效状态
安装完成后首次启动,立刻连上去执行:
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; SELECT @@init_connect;
必须同时满足:
-
character_set_client、character_set_connection、character_set_results、character_set_server全为utf8mb4 -
collation_server为utf8mb4_0900_ai_ci(不是utf8mb4_unicode_ci,更不能是utf8mb4_general_ci) -
@@init_connect显示SET NAMES utf8mb4
任一不满足,说明配置未被读取——常见于路径错、段落写进 [mysqld_safe]、或被同名配置文件覆盖(比如 /etc/mysql/conf.d/ 下有冲突项)。
系统表和 performance_schema 不会自动升级
即使你安装前配好了 my.cnf,MySQL 初始化时仍可能把 mysql、sys、performance_schema 这些库建在旧字符集上(尤其 Windows MSI 和某些 Docker 镜像)。验证方式:
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME IN ('mysql', 'sys', 'performance_schema');
若结果含 utf8 或 latin1,说明初始化阶段未真正使用你的配置——此时只能重装,或接受这些系统库无法存 emoji 的事实。没有安全的在线转换方案。











