phpMyAdmin 无法执行带 BOM 头的 UTF-8 SQL 文件,因解析器未跳过 EF BB BF 字节,将其误作非法 SQL token 导致语法错误;需用 sed 或 PowerShell 剥离 BOM,并确保配置 UploadDir 启用、手动选 utf8mb4 字符集。
phpmyadmin 无法直接执行带 bom 头的 utf-8 sql 文件,会报错 invalid default value for 'xxx' 或直接卡在解析第一行,根本不是编码问题,而是 bom 被当作了非法 sql 字符。
UTF-8 BOM(EF BB BF)是三个不可见字节,位于文件开头。phpMyAdmin 的 SQL 解析器不跳过它,而是尝试把 (BOM 的 ASCII 可视化表现)当作 SQL 语句开头——这显然不是合法的 SQL token,导致后续所有语句偏移、关键字识别失败、字段名错位,甚至触发 MySQL 严格模式下的默认值校验异常。
别在 Windows 记事本里“另存为 UTF-8 无 BOM”——它实际存的是带 BOM 的“UTF-8”,名字有误导性。直接用终端处理最可靠:
sed -i '1s/^xEFxBBxBF//' your_file.sql(Linux/macOS)(Get-Content your_file.sql -Raw) -replace "^uFEFF", "" | Set-Content your_file.sql -Encoding UTF8
head -c 5 your_file.sql | hexdump -C,输出首行不应含 ef bb bf
即使去除了 BOM,如果 SQL 文件含 SET NAMES utf8mb4 或 CREATE TABLE 前有注释,仍可能因 phpMyAdmin 的字符集协商逻辑出错:
$cfg['UploadDir'] 已启用且路径可读(否则大文件走 POST 上传,BOM 更容易被截断或误判)utf8mb4(不是 utf8),并勾选 Partial import: Ignore duplicate entries——部分 BOM 残留可能引发重复主键误报,勾选后能跳过而非中断mysql 命令行:mysql -u user -p database_name ,它天然忽略 BOM
BOM 是隐形破坏者,它不报编码错误,只让 SQL 执行变得“莫名其妙”。处理它的关键不是换工具,而是意识到:phpMyAdmin 的 SQL 解析器根本不设计为容忍任何前置非空格字节——哪怕那只是三个看不见的标记。
立即学习“PHP免费学习笔记(深入)”;