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编辑入口,但可通过命令行静默安装+预置配置文件实现全自动。 先准备
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 中挂载数据卷后环境变量失效这两点。一旦跳过验证步骤,上线后才暴露乱码或时间差,排查成本远高于安装时多敲两行配置。
