结论:升级MySQL 8.0后GROUP BY报错1055是因默认启用ONLY_FULL_GROUP_BY模式,要求SELECT中非聚合字段必须出现在GROUP BY子句或用ANY_VALUE()包裹;客户端连不上则因caching_sha2_password插件不兼容,应优先用ALTER USER切换为mysql_native_password并FLUSH PRIVILEGES。

直接说结论:升级不是“换二进制包重启就行”,sql_mode、字符集、认证插件、关键字这四类问题会立刻让你的业务报错或连不上库。
GROUP BY 报错 1055 是因为 ONLY_FULL_GROUP_BY 默认开启
5.7 升级后最常见的报错就是 ERROR 1055,典型提示是 “Expression #2 of SELECT list is not in GROUP BY clause”。这不是语法写错了,而是 MySQL 8.0 默认启用了 ONLY_FULL_GROUP_BY 模式,强制要求 SELECT 列表里所有非聚合字段必须出现在 GROUP BY 中。
- 查当前模式:
SELECT @@sql_mode;,如果返回包含ONLY_FULL_GROUP_BY,就是它 - 临时修复(仅当前会话):
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); - 长期方案:改 SQL,把所有非聚合字段加进
GROUP BY,或用ANY_VALUE()显式包裹(MySQL 5.7.5+ 支持) - 别全局禁用:在
my.cnf里删掉ONLY_FULL_GROUP_BY虽然能跑通老 SQL,但掩盖了逻辑不确定性风险
客户端连不上:caching_sha2_password 认证不兼容
MySQL 8.0 默认用 caching_sha2_password 插件,但很多旧客户端(如 PHP 7.2 以下、Java mysql-connector-java SQLSTATE[HY000] [2054]。
- 检查用户插件:
SELECT host, user, plugin FROM mysql.user WHERE user = 'your_user'; - 切回兼容插件:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES; - 注意:改完后要重启应用连接池,否则旧连接仍用缓存的失败凭证
- 别只改 root:所有业务用户都要检查,尤其是定时任务、后台服务用的账号
字符集和排序规则混用触发 ERROR 1267
8.0 默认 collation_server = utf8mb4_0900_ai_ci,而 5.7 常用的是 utf8mb4_general_ci。当两个不同 collation 的字段参与比较(比如 FIND_IN_SET、JOIN、WHERE),就会爆 ERROR 1267 (HY000): Illegal mix of collations。
- 查字段 collation:
SHOW CREATE TABLE your_table;看各列定义 - 统一 collation 最稳妥:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; - 临时绕过(不推荐):
CONVERT(col_name USING utf8mb4) COLLATE utf8mb4_0900_ai_ci在 SQL 里强转 - 注意系统库:
mysql库本身在 8.0 已用新 collation,千万别拿 5.7 的mysqldump --all-databases直接恢复
SQL 文件导入失败:保留字、MyISAM 系统表、PASSWORD() 函数
用 mysqldump 从 5.7 导出再导入 8.0,常卡在三类地方:字段名撞了新保留字(如 rank、role)、SQL 里写了 ENGINE=MyISAM 且涉及系统表、还有用 PASSWORD() 加密的密码语句。
-
rank这种关键字必须加反引号:SELECT @r:=@r+1 AS `rank` FROM ... - 导出时严格排除系统库:
mysqldump -u root -p --databases your_db --skip-lock-tables > backup.sql,绝对不用--all-databases - 查 MyISAM 表:
SELECT table_schema, table_name, engine FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('information_schema','performance_schema','sys');,业务表可改ALTER TABLE t ENGINE=InnoDB; -
PASSWORD()已废弃,建用户改用CREATE USER ... IDENTIFIED BY 'xxx';
最易被忽略的一点:升级不是单点操作,是链条。比如你改了认证插件,但没同步更新 JDBC URL 里的 allowPublicKeyRetrieval=true 参数,或者统一了字符集,却忘了调整应用层的连接参数 characterEncoding=utf8mb4,照样出问题。


















