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

Docker中MySQL容器/docker-entrypoint-initdb.d脚本执行编码异常问题

解决MySQL容器初始化脚本特殊字符乱码问题

问题根源

虽然你的表已指定utf8mb4字符集,但Docker容器执行/docker-entrypoint-initdb.d内的脚本时,MySQL客户端默认使用的编码并非UTF-8(通常是latin1),导致UTF-8编码的特殊字符(如ß、ö)被错误转码为乱码(如ß)。手动执行脚本正常是因为你本地MySQL客户端已配置了UTF-8编码。

解决方案

1. 在SQL脚本开头强制设置字符集

在schema.sql的最顶部添加以下语句,强制MySQL客户端以utf8mb4编码读取脚本内容:

SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;

CREATE TABLE `test`
(
    `Nr`                     int(10)    NOT NULL DEFAULT '0',
    `Test`                   varchar(50)         DEFAULT NULL,
    `Straße`                 varchar(30)         DEFAULT NULL,
    `Ü`                      varchar(40)         DEFAULT NULL,
    `Ö`                      varchar(40)         DEFAULT NULL
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

2. 通过Docker环境变量全局配置字符集

修改Dockerfile,添加环境变量让MySQL服务和客户端默认使用utf8mb4编码:

FROM mysql
# 设置MySQL初始化时跳过时区信息(可选,避免时区相关干扰)
ENV MYSQL_INITDB_SKIP_TZINFO=1
# 全局设置字符集和排序规则
ENV MYSQL_CHARSET=utf8mb4
ENV MYSQL_COLLATION=utf8mb4_unicode_ci

COPY schema.sql /docker-entrypoint-initdb.d/

3. 确保SQL脚本本身为UTF-8编码(无BOM)

检查schema.sql的文件编码:

  • 在Linux/macOS下执行命令:
    file -i schema.sql
    
    输出应显示text/plain; charset=utf-8,如果是其他编码(如iso-8859-1),需将文件转换为UTF-8编码:
    iconv -f iso-8859-1 -t utf-8 schema.sql > schema_utf8.sql && mv schema_utf8.sql schema.sql
    
  • 在Windows下,用记事本打开文件,选择「另存为」,编码选择「UTF-8」(不要选「UTF-8带BOM」)。

验证方法

重新构建镜像并启动容器:

docker build -t mysql-utf8 .
docker run -d -e MYSQL_ROOT_PASSWORD=your_password mysql-utf8

进入容器查询表结构和数据:

docker exec -it <container_id> mysql -uroot -pyour_password
USE <your_database>;
DESC test;
SELECT * FROM test;

此时特殊字符应能正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:10:30