mysql 8.0升级常见问题包括:①group by报错因only_full_group_by启用,需检查逻辑或用any_value();②json函数仅5.7+支持;③compressed行格式在5.6/8.0有兼容限制;④默认认证插件改为caching_sha2_password,旧客户端需改回mysql_native_password。

MySQL 8.0 用 GROUP BY 报错:Expression #1 of SELECT list is not in GROUP BY clause
这是 MySQL 5.7 升级到 8.0 后最常撞上的语法墙。8.0 默认启用了 sql_mode=ONLY_FULL_GROUP_BY,它要求 SELECT 列表里的每个非聚合字段,必须显式出现在 GROUP BY 子句里。
常见错误现象:ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause...
- 别急着关
ONLY_FULL_GROUP_BY—— 它报错往往说明你写的 SQL 逻辑本身模糊(比如选了name却没指定按哪个name聚合) - 先检查业务意图:真要取分组后的任意一条?还是漏写了
GROUP BY字段? - 如果确认是兼容性过渡需求,临时关闭方式:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));(仅当前会话生效) - 生产环境不建议全局禁用,更稳妥的是重写 SQL,用
ANY_VALUE(name)显式声明“我只要任意值”
MySQL 5.6 不支持 JSON_EXTRACT 或 -> 操作符
想用 SELECT data->'$.user.id' FROM logs 却提示 FUNCTION JSON_EXTRACT does not exist?那是版本太老 —— JSON 函数是 MySQL 5.7 才引入的。
使用场景:处理日志、配置、埋点等半结构化数据时,想避免应用层解析
- 5.6 及更早版本只能靠
SUBSTRING_INDEX+ 正则(REGEXP)硬解析,既慢又易错 - 5.7+ 推荐用
data->>'$.user.id'(带>>是去引号版,返回字符串而非 JSON 字面量) - 注意:即使版本够,也要确保字段类型是
JSON;若存为TEXT,函数仍可运行但无校验、无索引优化
CREATE TABLE ... ENGINE=InnoDB ROW_FORMAT=COMPRESSED 在 MySQL 5.7 报错
复制别人博客里的建表语句,执行时报 ERROR 1031 (HY000): Table storage engine for 't' doesn't have this option,大概率是 ROW_FORMAT=COMPRESSED 不被当前引擎/版本支持。
参数差异和兼容性影响:
-
COMPRESSED行格式依赖innodb_file_per_table=ON且innodb_file_format=Barracuda(后者在 5.7.7+ 已废弃,默认启用) - MySQL 5.6 中需显式设置
innodb_file_format=Barracuda才能用COMPRESSED - MySQL 8.0 移除了
innodb_file_format配置项,COMPRESSED依然可用,但压缩表无法用ALGORITHM=INPLACE做在线 DDL - 简单替代方案:直接删掉
ROW_FORMAT=COMPRESSED,用默认DYNAMIC—— 大多数场景下空间收益有限,反而增加维护复杂度
用 mysql -u root -p 连不上,提示 Access denied for user 'root'@'localhost'(但密码没错)
这不是语法错误,却是升级后高频卡点:MySQL 8.0 默认认证插件从 mysql_native_password 改成 caching_sha2_password,老客户端(如某些 Python MySQL 驱动、旧版 Navicat)不支持。
检查方法:SELECT user, host, plugin FROM mysql.user WHERE user='root';
- 如果
plugin是caching_sha2_password,而你的客户端连不上,最直接的解法是改回传统插件:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 不是所有客户端都能升级支持新插件,尤其内嵌数据库连接的旧系统
- 别用
UPDATE mysql.user SET plugin='mysql_native_password'直接改表 —— 密码哈希可能失效,必须用ALTER USER重置
版本兼容性这事,从来不是“换完就跑”,而是得盯着每条 SQL、每个连接、每个建表参数,看它在目标环境里到底认不认账。











