MySQL 5.7 与 8.0 默认配置差异显著,涉及字符集(latin1→utf8mb4)、排序规则(宽松→严格)、认证插件(mysql_native_password→caching_sha2_password)、保留字扩展等,直接影响连接、建表、查询及备份恢复,升级前须显式指定字符集与校对规则、检查存量库配置、验证客户端兼容性并全量测试。

mysql 5.7 和 8.0 的默认配置差异不是“改了几行参数”那么简单,而是直接影响连接、建表、查询、权限甚至备份恢复的底层行为。升级前不厘清这些,dump/restore 后服务起不来、SQL 报错、中文变问号,都是大概率事件。
字符集与排序规则默认值变了,建表语句可能直接失效
MySQL 5.7 默认用 latin1 + latin1_swedish_ci;8.0 默认是 utf8mb4 + utf8mb4_0900_ai_ci。这不是“更友好”的升级,而是行为切换:
- 没显式指定字符集的旧建表语句(比如
CREATE TABLE t (name VARCHAR(255))),在 5.7 下建出来是 latin1 表,存中文就乱码;在 8.0 下建出来是 utf8mb4 表,但排序逻辑更严格——utf8mb4_0900_ai_ci对大小写、重音敏感,而老项目常依赖utf8mb4_unicode_ci或utf8mb4_general_ci的宽松匹配 -
utf8mb4_0900_ai_ci的索引长度上限比老 collation 更低:同样字段定义,可能因排序规则变严导致索引超限(Specified key was too long) - 迁移时别指望 mysqldump 自动“适配”:它会原样导出建表语句,如果源库是 5.7 的 latin1 表,restore 到 8.0 就还是 latin1,后续插入 emoji 直接报错或截断
实操建议:所有建库建表语句显式带上 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,别靠默认值;升级前用 SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'your_db'; 检查存量库实际字符集。
caching_sha2_password 认证插件导致客户端连不上
MySQL 8.0 初始化后,root 和新建用户默认使用 caching_sha2_password 插件,而大量旧工具不支持:
- Navicat ≤ 12、DBeaver 早期版本、Python 的
mysql-connector-pythonAuthentication plugin 'caching_sha2_password' cannot be loaded - Windows 安装器里有个 “Use Legacy Authentication Method” 勾选项,装的时候选上能绕过,但只是临时掩耳盗铃
-
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';可临时回退,但 MySQL 8.4 已彻底废弃该插件,现在妥协,后面驱动升级成本更高
实操建议:优先升级客户端驱动;若必须兼容旧工具,至少确保只对内网可信连接启用 mysql_native_password,并记录例外原因;检查用户插件用 SELECT user, host, plugin FROM mysql.user;。
sql_mode 更严格,GROUP BY 和 INSERT 突然失败
MySQL 8.0 默认开启 STRICT_ALL_TABLES 和 ONLY_FULL_GROUP_BY,而 5.7 是 STRICT_TRANS_TABLES 且 NO_AUTO_CREATE_USER 还在:
-
SELECT a, b FROM t GROUP BY a在 5.7 能跑(b值取分组内任意一行),8.0 直接报错:Expression #2 of SELECT list is not in GROUP BY clause - 向
NOT NULL字段插入NULL,5.7 可能只警告,8.0 直接拒绝 - 备份文件里含
NO_AUTO_CREATE_USER(如从 5.7 mysqldump 导出),在 8.0 执行会报错:Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'
实操建议:别用 SET sql_mode = '' 关掉严格模式——这是掩盖问题;逐条检查业务 SQL,补全 GROUP BY、加 IFNULL()、设 DEFAULT 值;升级前清理 dump 文件里的已废弃 mode 项。
保留字增多,字段名或表名突然语法错误
MySQL 8.0 把 RANK、FIRST_VALUE、JSON_EXTRACT、VISIBLE、INVISIBLE 等全列为保留关键字:
- 沿用 5.7 的
CREATE TABLE logs (id INT, rank INT),在 8.0 会报错:You have an error in your SQL syntax - 这类错误不会在启动或备份时暴露,只有执行到对应 DDL 或查询时才触发,排查成本高
- 不是所有旧字段名都撞上,但像
rank、group、partition这类常见词风险极高
实操建议:升级前用 SELECT keyword FROM information_schema.KEYWORDS WHERE reserved = 1 AND db_version >= '8.0'; 获取 8.0 新增保留字列表,批量扫描建表语句;字段名加反引号不是长久之计,应主动重命名。


















