如何通过文件方式修改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命令行,分别执行以下命令验证配置是否生效:
- 时区验证:
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
相关产品推荐
相关产品推荐

