MySQL 5.7不支持utf8mb4_0900_ai_ci,需替换为utf8mb4_unicode_ci;5.6及更早版本须同步降级字符集为utf8并改用utf8_general_ci,否则报Unknown collation错误。

直接替换掉 utf8mb4_0900_ai_ci 等 MySQL 8.0+ 排序规则,换成目标 MySQL 版本真正支持的 utf8mb4_unicode_ci(5.7)或 utf8_general_ci(5.6 及更早),不是“修错”,是“降级适配”。
确认 MySQL 版本再动手
报 Unknown collation: 'utf8mb4_0900_ai_ci' 不是文件损坏,而是版本不兼容。先查清目标库版本:
- 在 phpMyAdmin 的“SQL”页执行:
SELECT VERSION(); - 或终端运行:
mysql --version - MySQL 5.7:统一换为
utf8mb4_unicode_ci(比utf8mb4_general_ci更准,且兼容性好) - MySQL 5.6 或更早:必须连字符集一起降级——把所有
CHARACTER SET utf8mb4改成CHARACTER SET utf8,再把COLLATE换成utf8_general_ci
安全替换 COLLATE 而不引发 ERROR 1253
不能只改 COLLATE 却留着不匹配的 CHARACTER SET,否则触发 ERROR 1253 (HY000)。建表语句里出现这种写法就是非法的:DEFAULT CHARSET=utf8 COLLATE=utf8mb4_0900_ai_ci。
- 先用
grep -n "utf8mb4_0900" dump.sql定位范围,避免盲目全局替换 - 推荐做法:删掉整段显式
COLLATE=...子句,让 MySQL 用数据库默认规则(前提是目标库已设好默认utf8mb4) - 如果目标库还没建,先执行:
CREATE DATABASE mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;,再导入 - 别信
SET NAMES utf8mb4或命令行加--default-character-set=utf8mb4——它们只管连接层,压不住 SQL 文件里硬编码的COLLATE
phpMyAdmin 6.0 导入大文件或含新语法的 SQL
phpMyAdmin 6.0 不做任何兼容性转换,它只是把 SQL 原样发给 MySQL 执行。遇到 JSON_OBJECT()、GENERATED COLUMN 或超长 INSERT 会直接失败。
立即学习“PHP免费学习笔记(深入)”;
- 超过 2MB 的文件,放弃界面上传,改用命令行:
mysql -u root -p --default-character-set=utf8mb4 db_name < dump.sql - 必须用 phpMyAdmin?先删掉 SQL 文件里的
SET time_zone = "+00:00"(防 #1298 错误),再用sed -i 's/INSERT INTO/;INSERT INTO/g' dump.sql拆分语句降低解析压力 - 导入前在 phpMyAdmin “SQL”页手动执行:
SET FOREIGN_KEY_CHECKS=0;和SET SQL_MODE='';,避开外键和严格模式干扰 - 看到
ERROR 1064卡在JSON或GENERATED上?临时把JSON_OBJECT('k','v')替成'{"k": "v"}',导入后再补逻辑
导入后中文乱码或字段被截断
这说明连接层没对齐,不是表结构问题。即使建表写了 utf8mb4,但 @@character_set_client 是 latin1,数据进库前就解码错了。
- 导入后立刻执行:
SELECT @@character_set_client, @@character_set_connection, @@character_set_results;——三项必须全为utf8mb4 - 编辑
config.inc.php,在对应服务器配置块里补三行:$cfg['Servers'][$i]['charset'] = 'utf8mb4';、$cfg['Servers'][$i]['connection_charset'] = 'utf8mb4';、$cfg['DefaultCharset'] = 'utf8mb4';,改完必须重启 Web 和 MySQL 服务 - 检查 SQL 文件是否 UTF-8 无 BOM:
hexdump -C dump.sql | head -n 1,开头是ef bb bf就得删:sed -i '1s/^\xEF\xBB\xBF//' dump.sql - 别忽略建表语句末尾——每张表都得有
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,utf8是残缺实现,存不了 emoji
最容易被忽略的是:替换排序规则时没同步处理 CHARACTER SET 声明,或者改了 SQL 文件却忘了调通连接层三参数;还有人以为 phpMyAdmin 会自动“理解”旧版兼容性,其实它连 utf8mb4_0900_ai_ci 是啥都不校验,照传不误。



















