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.sqltext/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
相关产品推荐
相关产品推荐

