MySQL 8.0 安装时应通过 my.cnf(或 my.ini、环境变量)一次性配置 utf8mb4 字符集、utf8mb4_0900_ai_ci 校对规则、default-time-zone='+08:00' 及 init_connect='SET NAMES utf8mb4',并注意 root 用户不触发 init_connect、Docker 挂载数据卷后环境变量失效等关键细节。

MySQL 8.0 安装时通过 my.cnf 一次性设好字符集
安装阶段就配对字符集,能避免后续改 character_set_server 和 collation_server 引发的表/列乱码、连接层不一致等问题。关键不是只设 utf8——MySQL 里它不支持 emoji 和部分汉字,必须用 utf8mb4。
-
character_set_server = utf8mb4:控制新建数据库默认字符集 -
collation_server = utf8mb4_0900_ai_ci:MySQL 8.0 默认校对规则,区分大小写和重音更合理 - 别漏掉客户端层:
init_connect = 'SET NAMES utf8mb4'(仅对普通用户生效,root 不触发) - 如果用 Docker,
my.cnf需挂载到容器内/etc/mysql/my.cnf或/etc/my.cnf,且权限为 644
Linux 下 mysqld 启动前强制指定时区(非系统时区)
MySQL 默认读系统时区(/etc/localtime),但生产环境常需统一为 Asia/Shanghai,尤其跨机房部署时。不能只靠 SET time_zone = '+8:00' 临时设置——它不作用于日志、事件调度器、函数如 NOW() 的初始化值。
- 在
[mysqld]段加:default-time-zone = '+08:00'(推荐,简单稳定) - 或用命名时区:
default-time-zone = 'Asia/Shanghai',但要求 MySQL 已加载时区表(需运行mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql) - 验证是否生效:
SELECT @@global.time_zone, @@session.time_zone;
- 注意:修改后必须重启
mysqld,FLUSH PRIVILEGES无效
Windows 安装包(MSI)中跳过向导、静默配置字符集与时区
图形化安装向导不暴露 my.ini 编辑入口,但可通过命令行静默安装+预置配置文件实现全自动。
ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有
- 先准备
my.ini,放在例如C:\mysql\my.ini,含完整[mysqld]段(含character_set_server和default-time-zone) - 执行安装命令:
msiexec /i mysql-installer-community-8.0.xx.msi /quiet CONFIGTYPE=configTypeServer INI_FILE="C:\mysql\my.ini"
-
CONFIGTYPE=configTypeServer是关键开关,否则 installer 会忽略INI_FILE - 安装后检查:
mysqld --verbose --help | grep "default-time-zone\|character-set-server"
docker run 启动时覆盖默认字符集与时区(无需自定义 my.cnf)
用官方镜像时,不必打包自己的配置文件——MySQL 8.0+ 支持通过环境变量直接注入核心参数。
- 启动命令示例:
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
- 其中
TZ环境变量影响容器系统时区,进而被mysqld读取为默认时区(前提是没显式设default-time-zone) - 若同时设
default-time-zone和TZ,前者优先级更高 - 注意:
MYSQL_*环境变量只对首次初始化生效;容器重建时若挂载了已有数据卷,这些变量会被忽略
实际部署时最容易被忽略的是 init_connect 对 root 用户无效,以及 Docker 中挂载数据卷后环境变量失效这两点。一旦跳过验证步骤,上线后才暴露乱码或时间差,排查成本远高于安装时多敲两行配置。









