wangguangwu
wangguangwu
发布于 2024-12-25 / 22 阅读
0
0

配置MySQL的Docker Compose文件及字符集设置

简介

本文档描述了如何通过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

关键配置说明

  1. 字符集与排序规则:

    • --character-set-server=utf8mb4: 设置 MySQL 服务的默认字符集为 utf8mb4,支持更多 Unicode 字符。
    • --collation-server=utf8mb4_unicode_ci: 设置默认排序规则为 utf8mb4_unicode_ci,支持中文等复杂字符的排序。
  2. 语言与时区:

    • LANG: C.UTF-8: 设置容器内语言环境为 UTF-8
    • TZ: Asia/Shanghai: 设置时区为中国上海时区,确保时间相关数据正确。
  3. 健康检查:

    • 使用mysqladmin工具对MySQL实例进行健康检查,确保服务可用后其他依赖服务可以正常启动。
  4. 持久化与初始化:

    • volumes挂载了两个目录:
      • /var/lib/mysql: 用于持久化存储数据库数据。
      • /docker-entrypoint-initdb.d: 用于存放初始化 SQL 脚本,MySQL 容器启动时会自动执行这些脚本。

验证字符集设置

启动容器后,可以通过以下步骤验证字符集是否正确配置:

  1. 进入 MySQL 容器:

    docker exec -it mysql mysql -u root -p123456
    
  2. 执行以下 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,避免中文等特殊字符出现乱码,同时实现数据持久化和初始化脚本的自动执行。


评论