必须检查字符集与排序规则、认证插件、sql_mode、保留关键字四类兼容性断点;MySQL 8.0默认utf8mb4+utf8mb4_0900_ai_ci、caching_sha2_password插件、STRICT_ALL_TABLES与ONLY_FULL_GROUP_BY模式及新增保留字如RANK、JSON等,均可能导致乱码、连接失败、GROUP BY报错或建表语法错误。

新项目直接用 MySQL 8.0,别犹豫;老系统升级前必须先查这四类兼容性断点。
字符集和排序规则默认值变了
MySQL 5.7 默认用 latin1 + latin1_swedish_ci,建库建表不显式指定时,中文字段可能乱码、emoji 直接被截断或报错;MySQL 8.0 默认就是 utf8mb4 + utf8mb4_0900_ai_ci,解决了基础 Unicode 支持问题。
但要注意:utf8mb4_0900_ai_ci 的排序逻辑比旧版 utf8mb4_unicode_ci 更严格(大小写、重音敏感),如果业务依赖 ORDER BY 或唯一索引的隐式行为,升级后可能查不到预期数据。dump/restore 不会自动适配,建表语句里建议显式写上 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci。
caching_sha2_password 认证插件导致连接失败
MySQL 8.0 默认认证插件从 mysql_native_password 换成 caching_sha2_password,很多老工具连不上,典型错误是:Authentication plugin 'caching_sha2_password' cannot be loaded。
- Navicat ≤ 12、旧版
mysql-connector-python、某些 PHP 扩展都可能报这个错 - 临时解法:执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 但别长期依赖——MySQL 8.4 已彻底废弃
mysql_native_password,现在不升级驱动,后面更被动 - Windows 安装器里勾选 “Use Legacy Authentication Method” 可绕过该问题
sql_mode 默认更严格,GROUP BY 和 INSERT 突然报错
MySQL 8.0 默认启用 STRICT_ALL_TABLES 和 ONLY_FULL_GROUP_BY,而 5.7 是 STRICT_TRANS_TABLES 且不强制 ONLY_FULL_GROUP_BY。
常见报错:
-
Expression #2 of SELECT list is not in GROUP BY clause:SELECT 中非聚合字段没出现在 GROUP BY 里 -
Field 'xxx' doesn't have a default value:插入 NULL 到 NOT NULL 字段 -
Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER':备份文件含已移除的 mode,恢复直接失败
别用 SET sql_mode = '' 关掉——这是饮鸩止渴。应该逐条检查 SQL,补全 GROUP BY、加 IFNULL、明确 DEFAULT 值。
保留字增多,原来能用的字段名现在语法报错
MySQL 8.0 把 RANK、FIRST_VALUE、JSON_EXTRACT 等全设为保留关键字。沿用 5.7 的建表习惯会直接失败:
CREATE TABLE logs (id INT, rank INT);
报错:ERROR 1064 (42000): You have an error in your SQL syntax。
解决办法只有两个:
- 给字段名加反引号:
`rank` - 换名,比如改成
rank_value或user_rank
这类问题不会在启动时报错,只在建表或 ALTER 时暴露,容易漏测。
真正麻烦的不是功能多,而是那些不报错但行为微变的地方:排序规则差异、统计信息直方图启用后执行计划偏移、INVISIBLE 索引被误删、CTE 递归深度限制等——这些得靠压测和慢查询日志盯住,不能只看迁移是否成功。


















