简介
本文档描述了如何通过docker-compose.yml
配置MySQL容器,重点是确保字符集为utf8mb4
,以支持中文等特殊字符,避免出现乱码问题。
Docker Compose 配置文件
以下是完整的docker-compose.yml
文件内容:
version: '3'
services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
LANG: C.UTF-8
TZ: Asia/Shanghai # 设置时区
# 配置 MySQL 的字符集和排序规则
MYSQL_CHARSET: utf8mb4
MYSQL_COLLATION: utf8mb4_unicode_ci
ports:
- "3306:3306"
networks:
- cloud-alibaba-net
volumes:
- ./docker/mysql/data:/var/lib/mysql # 数据持久化存储
- ./doc/sql:/docker-entrypoint-initdb.d # MySQL初始化SQL脚本
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"]
interval: 5s
timeout: 3s
retries: 10
command: [ '--default-authentication-plugin=mysql_native_password', '--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci' ]
restart: always
关键配置说明
-
字符集与排序规则:
--character-set-server=utf8mb4
: 设置 MySQL 服务的默认字符集为utf8mb4
,支持更多 Unicode 字符。--collation-server=utf8mb4_unicode_ci
: 设置默认排序规则为utf8mb4_unicode_ci
,支持中文等复杂字符的排序。
-
语言与时区:
LANG: C.UTF-8
: 设置容器内语言环境为UTF-8
。TZ: Asia/Shanghai
: 设置时区为中国上海时区,确保时间相关数据正确。
-
健康检查:
- 使用
mysqladmin
工具对MySQL实例进行健康检查,确保服务可用后其他依赖服务可以正常启动。
- 使用
-
持久化与初始化:
volumes
挂载了两个目录:/var/lib/mysql
: 用于持久化存储数据库数据。/docker-entrypoint-initdb.d
: 用于存放初始化 SQL 脚本,MySQL 容器启动时会自动执行这些脚本。
验证字符集设置
启动容器后,可以通过以下步骤验证字符集是否正确配置:
-
进入 MySQL 容器:
docker exec -it mysql mysql -u root -p123456
-
执行以下 SQL 查询:
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%';
期望输出:
character_set_server
应为utf8mb4
。collation_server
应为utf8mb4_unicode_ci
。
示例 SQL 文件
为了确保初始化时的表结构和数据也支持中文字符集,建议在初始化 SQL 文件中显式声明字符集和排序规则,例如:
CREATE DATABASE IF NOT EXISTS `testdb`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE TABLE `test_table` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL COMMENT '名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `test_table` (`name`) VALUES ('测试');
总结
通过以上配置,您可以确保 MySQL 容器的字符集为 utf8mb4
,避免中文等特殊字符出现乱码,同时实现数据持久化和初始化脚本的自动执行。