You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过文件方式修改Docker镜像中MySQL的时区与字符集

Docker部署MySQL通过配置文件修改时区与字符集方案

从默认配置查询结果可确认当前存在两个问题:

  • 时区默认使用UTC,与东八区(UTC+8)存在8小时时差,会导致时间类型数据的存储、查询结果与业务实际时间不符
  • 客户端、连接、结果返回链路的字符集默认为latin1,不支持中文字符,即使库、服务端字符集已经是utf8mb4,链路字符集不匹配依然会触发中文乱码

编写自定义配置文件

在宿主机新建my.cnf配置文件,同时配置东八区时区与全链路UTF-8字符集,配置内容如下:

[mysqld]
# 设置服务端时区为东八区
default-time-zone = '+08:00'
# 服务端字符集设置为utf8mb4(即完整UTF-8编码,支持所有Unicode字符含emoji)
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

[client]
# 客户端默认字符集
default-character-set = utf8mb4

[mysql]
# MySQL命令行工具默认字符集
default-character-set = utf8mb4

注意:MySQL中utf8是历史遗留的utf8mb3别名,最多仅支持3字节长度的Unicode字符,无法存储emoji等4字节字符,生产环境统一使用utf8mb4才是标准的完整UTF-8实现。

启动容器时挂载配置文件

启动MySQL容器时,将编写好的my.cnf挂载到容器内的/etc/mysql/conf.d/目录下,该目录下所有.cnf后缀的文件会被MySQL自动加载,以增量方式覆盖默认配置,不会破坏镜像原有配置逻辑。

docker启动命令参考

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=替换为你的数据库root密码 \
  # 挂载自定义MySQL配置
  -v /宿主机存放my.cnf的绝对路径/my.cnf:/etc/mysql/conf.d/my.cnf \
  # 同步宿主机时区到容器,保证容器系统时区与东八区一致
  -v /etc/localtime:/etc/localtime:ro \
  mysql:8.0

docker-compose配置参考

在服务的volumes配置段添加以下挂载规则即可:

volumes:
  - ./my.cnf:/etc/mysql/conf.d/my.cnf
  - /etc/localtime:/etc/localtime:ro

配置生效验证

重启容器后进入MySQL命令行,分别执行以下命令验证配置是否生效:

  1. 时区验证:
show variables like '%time_zone';

预期结果中system_time_zone显示为CST,time_zone显示为+08:00即为配置成功。
2. 字符集验证:

SHOW VARIABLES LIKE 'character%';

预期结果中character_set_client、character_set_connection、character_set_results三个字段值均为utf8mb4,此时全链路字符集统一,不会再出现中文乱码问题。


内容的提问来源于stack exchange,提问作者XuXuClassMate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:09:23