如何让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
相关产品推荐
相关产品推荐

