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

如何让Docker MySQL在初始化脚本中使用Unicode(UTF-8)?

解决MySQL容器初始化脚本字符集异常问题

问题原因

你设置的--character-set-server=utf8mb4是服务器级默认字符集,仅对容器启动后的新连接生效,但容器执行/docker-entrypoint-initdb.d/下的初始化脚本时,使用的是初始化阶段的临时连接,并未继承这个服务器级设置,导致脚本里的特殊字符(如ž、ć)被错误转码。

解决方案

方案1:在初始化脚本开头添加字符集声明

直接在每个.sql初始化脚本的最顶部添加以下语句,强制当前会话使用utf8mb4字符集读取脚本内容:

SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;

修改后的插入脚本示例:

SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;

INSERT INTO vodovod_ulice (naziv)
VALUES ('Ulica Vuka Karadžića');

方案2:通过环境变量指定初始化阶段的字符集参数

在docker-compose.yml的mysql服务环境变量中添加MYSQL_INITDB_ARGS,明确指定初始化过程的字符集配置:

mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: [REDACTED]
      MYSQL_DATABASE: [REDACTED]
      MYSQL_USER: [REDACTED]
      MYSQL_PASSWORD: [REDACTED]
      # 添加这一行,指定初始化阶段的字符集参数
      MYSQL_INITDB_ARGS: "--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-character-set=utf8mb4"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql-init:/docker-entrypoint-initdb.d/:ro
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      - mynetwork
    ports:
      - "3307:3306"

这个参数会传递给初始化数据库的临时进程,确保脚本执行时使用正确的字符集读取内容。

额外检查

确保你的初始化脚本文件本身是UTF-8编码保存的(不要用GBK或其他编码),否则即使设置了数据库字符集,脚本文件本身的编码错误也会导致字符显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:14:58