MySQL初始化脚本报错主因是系统locale或SQL文件BOM干扰:需设LANG=en_US.UTF-8/LC_ALL=en_US.UTF-8,用xxd检查并去除UTF-8 BOM(ef bb bf),禁用init_connect做字符集兜底,改用character-set-server=utf8mb4。

MySQL初始化脚本报错:检查操作系统语言环境与编码设置
MySQL容器或本地初始化时,/docker-entrypoint-initdb.d/ 下的 SQL 脚本执行中断,日志里没报明显语法错误,但卡在某一行不动或直接退出——大概率是宿主机或容器启动环境的 LANG 或 LC_ALL 设置干扰了 MySQL 启动流程,尤其是涉及中文、特殊符号或 UTF-8 BOM 的脚本。
MySQL 8.0+ 的 mysqld 初始化过程会读取系统 locale,并影响字符集推导逻辑;若 LANG=C 或 LANG=POSIX,某些版本(如 8.0.23~8.0.33)会跳过对 UTF-8 的自动适配,导致后续脚本中含中文的 INSERT 或注释被截断解析,甚至触发 Unknown command '\xEF'(BOM 头被当命令执行)。
- 用
echo $LANG和echo $LC_ALL查看当前 shell 环境变量;若输出为C或空值,就是高风险信号 - Docker 启动容器时,务必显式设置环境变量:
-e LANG=en_US.UTF-8 -e LC_ALL=en_US.UTF-8,不能依赖镜像默认值 - 若使用
docker-compose.yml,需在environment块中声明,而非只写在command或 init 脚本里 - Linux 宿主机上临时修复:运行
export LANG=en_US.UTF-8; export LC_ALL=en_US.UTF-8后再docker build或docker run,否则构建阶段生成的镜像可能已固化错误 locale
SQL脚本本身带BOM却没被识别
Windows 编辑器(如 VS Code 默认、Notepad++ 未关“UTF-8 with BOM”选项)保存的 .sql 文件,开头三个字节 \xEF\xBB\xBF 会被 MySQL 解析器当作非法命令,直接报错 Unknown command '\xEF',且不提示具体文件名——这是最隐蔽也最高频的“脚本没执行”原因。
- 用
head -c 3 init.sql | xxd检查前 3 字节:若输出含ef bb bf,确认存在 BOM - 去除 BOM 最稳方式:
sed -i '1s/^\xEF\xBB\xBF//' init.sql(Linux/macOS),或用iconv -f UTF-8 -t UTF-8//IGNORE init.sql > init_clean.sql - VS Code 用户:右下角点击编码名称(如“UTF-8 with BOM”),选“Save with Encoding” → “UTF-8”
- Git 用户注意:
.gitattributes中加*.sql text eol=lf encoding=utf-8,防止 Windows 换行+编码双重污染
MySQL 8.0+ 对 init_connect 的兼容性限制
很多老教程教你在 my.cnf 里写 init_connect='SET NAMES utf8' 来统一连接字符集,但在 MySQL 8.0.19+ 中,该参数对 SUPER 用户(包括初始化阶段的 root)完全失效,且若语句本身语法有误(比如用了已废弃的 utf8 而非 utf8mb4),会导致初始化直接中止,日志只显示 [ERROR] Failed to initialize system tables,无更多线索。
- 初始化阶段不要依赖
init_connect做字符集兜底,它不生效;应确保character-set-server=utf8mb4和collation-server=utf8mb4_0900_ai_ci已写入[mysqld]段 -
init_connect仅对普通用户连接有效,且必须是合法可执行语句;SET NAMES utf8在 8.0+ 中会警告,应改用SET NAMES utf8mb4 - 若 init 脚本里有
CREATE DATABASE ... DEFAULT CHARSET=utf8,必须改为utf8mb4,否则 MySQL 8.0+ 会静默忽略或报错
真正麻烦的不是报错信息本身,而是错误发生在初始化早期——MySQL 还没来得及建库、写日志表,所以很多常规排查手段(如查 mysql.error_log)根本看不到上下文。盯住 docker logs 输出的第一屏、宿主机 locale、脚本文件二进制头这三处,基本能覆盖 90% 的“脚本看似没执行”问题。


















