需手动全局替换sql文件中的utf8mb4_0900_ai_ci和utf8mb4_0900_as_cs为utf8mb4_unicode_ci,并同步修正create database及collate=等写法;导出时应设phpmyadmin语法兼容性为mysql40并勾选“添加set sql_mode语句”预防问题。

导入报 Unknown collation: 'utf8mb4_0900_ai_ci' 怎么快速替换
这不是 phpMyAdmin 的 bug,而是 MySQL 8.0+ 导出的排序规则在 5.7 或更早版本里根本不存在。phpMyAdmin 只负责把 SQL 文件发给 MySQL 执行,不解析也不改写内容——所有替换必须手动做。
用 VS Code、Notepad++ 或 sed 直接处理 SQL 文件:
- 全局搜索
utf8mb4_0900_ai_ci→ 替换为utf8mb4_unicode_ci(MySQL 5.7 推荐) - 同时替换
utf8mb4_0900_as_cs→utf8mb4_unicode_ci(别漏掉这个,它常出现在触发器或视图定义里) - 检查
CREATE DATABASE行:如果开头有DEFAULT COLLATE utf8mb4_0900_ai_ci,一并改成utf8mb4_unicode_ci,否则建库就失败 - 别只搜 COLLATE —— 有些 dump 会写成
COLLATE=utf8mb4_0900_ai_ci(等号连接),正则可配COLLATE=[^ ]+辅助定位
为什么不能只改 COLLATE 而不碰 CHARACTER SET
MySQL 强制要求 collation 必须属于对应 character set。把 utf8mb4_0900_ai_ci 塞进 CHARACTER SET utf8 的表定义里,会立刻触发 ERROR 1253 (HY000)。
先确认你目标 MySQL 版本支持什么:
- MySQL 5.7:保留
CHARACTER SET utf8mb4,只换 collation - MySQL 5.6 或更早:必须同步把所有
CHARACTER SET utf8mb4改成CHARACTER SET utf8(注意这是 utf8mb3,不支持 emoji) - 检查建表语句是否混用:
DEFAULT CHARSET=utf8 COLLATE=utf8mb4_0900_ai_ci是非法写法,必须统一
phpMyAdmin 导入前还能做哪些预防性操作
与其导入失败再改文件,不如导出时就控制源头。如果你还能重新导出(比如自己有源库权限):
- 在 phpMyAdmin 右上角「设置」→「导出」→「格式」选项卡,把「语法兼容性」设为
MYSQL40 - 务必勾选「添加 SET SQL_MODE 语句」——它能规避因模式差异导致的零日期、空字符串插入失败
- 在「对象创建选项」里取消勾选「添加 DEFINER 和 SQL SECURITY」,避免 DEFINER 报错
- 如果导出命令可控,加
--skip-set-charset --collation-server=utf8mb4_unicode_ci,从根上避开 8.0 默认排序规则
替换后仍报错 Illegal mix of collations 怎么办
这个错误不是文件没改干净,而是 MySQL 在 JOIN、WHERE 或函数调用时,发现参与运算的字段来自不同 collation 上下文——比如一张表是 utf8mb4_unicode_ci,另一张是 utf8mb4_general_ci,或者连接层用的是 utf8mb4_0900_ai_ci。
排查顺序:
- 执行
SHOW CREATE TABLE table_a和SHOW CREATE TABLE table_b,对比两表的COLLATE是否一致 - 查连接层实际规则:
SELECT @@collation_connection,结果必须和两张表的 collation 同属utf8mb4_*系列 - 若 JOIN 字段是表达式(如
UPPER(name)),MySQL 会按连接层推导 collation,此时需显式加COLLATE utf8mb4_unicode_ci,例如:ON u.name COLLATE utf8mb4_unicode_ci = o.customer_name
真正麻烦的不是替换那几行文本,而是 collation 错配会藏在表定义、连接配置、甚至 ORM 默认行为里——改完 SQL 文件只是第一步。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











