MySQL 8.0 到 9.0 升级踩坑:别急着升,先看这些变化
David Ng | 2026-09-10T16:37:00 | Database
公司打算把数据库从 MySQL 8.0 升级到 9.0,我先在测试环境试了一下,发现了好几个需要注意的兼容性问题。
最近在调研 MySQL 9.0 的升级,因为 8.0 的生命周期快到了。在测试环境折腾了两天,记录一下踩过的坑。 ## 最大的变化:移除了 mysql_native_password MySQL 9.0 默认完全移除了 `mysql_native_password` 认证插件,只保留 `caching_sha2_password`。这意味着: - 老的客户端库如果不支持 `caching_sha2_password`,连接直接失败 - 一些老的 ORM 和数据库管理工具可能需要升级 - PHP 的 `mysqli` 扩展需要 7.4+,更老的版本连不上 我们有几个老项目还在用 MySQL 5.x 时代的客户端库,这下全都要升级。 ## GROUP BY 行为变化 MySQL 9.0 更严格地执行了 `ONLY_FULL_GROUP_BY` 模式。以前有些"碰巧能跑"的 SQL 现在会直接报错: ```sql -- 这条 SQL 在 8.0 可能能跑,9.0 直接报错 SELECT user_id, username, MAX(login_time) FROM users GROUP BY user_id; -- 因为 username 既不在 GROUP BY 里也不在聚合函数里 ``` 修复方案要么加到 GROUP BY 里,要么用 `ANY_VALUE()` 包裹。 ## JSON 函数增强 好消息是 JSON 相关的功能增强了不少: ```sql -- 新增 JSON_TABLE 的简化语法 SELECT * FROM orders, JSON_TABLE(order_items, '$[*]' COLUMNS( product_name VARCHAR(100) PATH '$.name', quantity INT PATH '$.qty' )) AS items; ``` ## 升级建议 1. **先在测试环境跑完整的回归测试**,不要直接升级生产 2. **检查所有客户端库**的兼容性,特别是认证方式 3. **跑一遍所有 SQL 语句**,检查 GROUP BY 和其他语法的兼容性 4. **备份!备份!备份!**升级前做一个完整的数据库备份 总之,MySQL 9.0 的变化不算大,但那几个 breaking change 足够让你翻车了。建议不要急着升级,等社区踩完坑再说。