安装前必须用my.cnf/my.ini预置utf8mb4,因mysql 8.0+图形化安装向导不支持选字符集,跳过将默认latin1,导致系统表、日志等底层对象编码错误且无法回溯修复。

安装前必须用 my.cnf/my.ini 预置 utf8mb4
MySQL 8.0+ 不支持在图形化安装向导里选字符集,跳过这步等于默认用 latin1——后续改配置会漏掉系统表、日志、事件调度器等底层对象的编码,乱码风险极高。唯一可靠方式是安装前准备好配置文件。
Linux 下把 my.cnf 放到 /etc/my.cnf 或 /etc/mysql/my.cnf;Windows 下把 my.ini 放到 MySQL 安装目录(如 C:\Program Files\MySQL\MySQL Server 8.0\),内容至少包含:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_0900_ai_ci init_connect = 'SET NAMES utf8mb4' skip-character-set-client-handshake = ON
-
utf8mb4_0900_ai_ci是 MySQL 8.0 默认校对规则,比utf8mb4_unicode_ci对大小写和重音更敏感,适合新项目 -
init_connect对普通用户生效,但root不触发,所以建库时仍要显式指定字符集 -
skip-character-set-client-handshake能防客户端(比如旧版 PHP 连接)强行覆盖服务端设置
Windows MSI 静默安装时如何注入配置
图形安装包(MSI)不暴露配置编辑界面,但支持命令行静默安装并加载预置配置文件。
执行以下命令(路径按实际调整):
msiexec /i mysql-installer-community-8.0.xx.msi /quiet CONFIGTYPE=configTypeServer INI_FILE="C:\mysql\my.ini"
-
CONFIGTYPE=configTypeServer是关键开关,缺了它INI_FILE会被忽略 -
my.ini必须已存在且权限正常,否则安装失败但无明确报错 - 安装完成后立即验证:
mysqld --verbose --help | grep "character-set-server\|default-time-zone"
Docker 启动时跳过自定义配置文件
官方镜像(mysql:8.0 及以上)支持环境变量直接覆盖核心参数,无需挂载 my.cnf。
启动命令示例:
docker run -d \ --name mysql8 \ -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_COLLATION_SERVER=utf8mb4_0900_ai_ci \ -e MYSQL_CHARACTER_SET_SERVER=utf8mb4 \ -e TZ=Asia/Shanghai \ -p 3306:3306 \ mysql:8.0
- 环境变量名必须全大写,且带
MYSQL_前缀,否则无效 -
TZ设置仅影响系统时区,MySQL 内部时间仍依赖default-time-zone;若需精确控制,得额外加-e MYSQL_INIT_COMMAND="SET GLOBAL time_zone = '+08:00'" - 挂载数据卷后,环境变量仍生效,但若同时挂载了
/etc/mysql/my.cnf,则以配置文件为准——变量被忽略
初始化命令行参数只对首次启动有效
如果你用 mysqld --initialize 手动初始化数据目录,必须在命令中显式传参,否则生成的 mysql 系统库仍用默认 latin1。
正确写法:
mysqld --initialize \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_0900_ai_ci \ --user=mysql \ --datadir=/var/lib/mysql
- 该命令只在空数据目录下执行一次,后续重启不走这个逻辑
- 如果初始化后才发现字符集错了,不能靠改配置重启修复——必须重新初始化(意味着丢数据)或逐表
ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 -
--collation-server参数在 MySQL 8.0.30+ 才被正式支持,旧版本要用--collation-server=utf8mb4_0900_ai_ci会报错,得换回utf8mb4_unicode_ci
最易被忽略的是 init_connect 对 root 用户无效,以及 Docker 挂载配置文件后环境变量失效这两点。一旦漏掉,新建数据库看似正常,但用 root 创建的表可能继承错误 collation,后期排查成本远高于安装时多花两分钟检查配置。











