MySQL 5.7 允许 GRANT 隐式创建用户(如 GRANT ... IDENTIFIED BY),而 8.0 严格禁止,必须先 CREATE USER 再 GRANT;且 5.7 默认认证插件为 mysql_native_password,8.0 为 caching_sha2_password,易致旧客户端连接失败。

MySQL 5.7 允许在 GRANT 语句中隐式创建用户(带 IDENTIFIED BY),而 MySQL 8.0 严格禁止这种写法,必须先 CREATE USER 再 GRANT。这不是“可选风格问题”,而是语法层面的硬性不兼容。
MySQL 5.7 中 GRANT 能自动建用户,但受 sql_mode 控制
5.7 默认允许类似这样的语句成功执行:
GRANT SELECT ON `app`.* TO 'api_user'@'10.0.2.%' IDENTIFIED BY 's3cr3t!';
它会检查用户是否存在,不存在就创建并赋权。但这个行为依赖 sql_mode 中是否包含 NO_AUTO_CREATE_USER:
- 若未启用
NO_AUTO_CREATE_USER(5.7 默认情况),该语句有效 - 若启用了
NO_AUTO_CREATE_USER,则GRANT不再自动建用户,会报错ERROR 1133 (42000): Can't find any matching row in the user table -
FLUSH PRIVILEGES在这种场景下通常不需要——GRANT自身已持久化权限
MySQL 8.0 直接报错:GRANT 不接受 IDENTIFIED BY
只要你在 GRANT 语句末尾写了 IDENTIFIED BY 或 IDENTIFIED WITH,8.0 就会拒绝解析,抛出明确语法错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual [...] near 'IDENTIFIED BY' at line 1
原因很直接:8.0 彻底移除了该语法路径,所有用户生命周期管理必须显式调用 CREATE USER。即使用户已存在,GRANT 也只管授权,不碰认证信息。
- 正确写法必须拆成两步:
CREATE USER 'u'@'h' IDENTIFIED BY 'p';→GRANT ... TO 'u'@'h'; - 如果想兼容 5.7 和 8.0 的初始化脚本,唯一安全写法是:
CREATE USER IF NOT EXISTS 'u'@'h' IDENTIFIED BY 'p';+ 独立GRANT -
CREATE USER在 5.7/8.0 中都支持IF NOT EXISTS,但注意 5.7 的CREATE USER不支持PASSWORD EXPIRE等 8.0 新参数
跨版本部署时最常踩的坑:认证插件不一致
即使你成功执行了 CREATE USER + GRANT,用户也可能连不上——不是权限问题,而是身份验证失败。根本原因是:
- MySQL 5.7 默认用
mysql_native_password插件 - MySQL 8.0 默认用
caching_sha2_password,老客户端(如 PyMySQL - 连接时典型报错:
Authentication plugin 'caching_sha2_password' cannot be loaded
解决方法不是降级 MySQL,而是按需指定插件:
CREATE USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'p';
或者对已有用户修正:
ALTER USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'p';
注意:改插件不会影响已有权限,但会重置密码哈希值,务必同步更新应用配置中的密码。
SHOW GRANTS 输出格式变化会影响自动化工具
如果你用脚本解析 SHOW GRANTS FOR 'u'@'h' 来做权限审计或回滚生成,8.0 的输出结构会让很多老工具失效:
- 5.7 中
USAGE权限会显式写出:GRANT USAGE ON *.* TO 'u'@'h' - 8.0 中
USAGE被省略,且新增角色行:GRANT `role_r`@`%` TO 'u'@'h' - 角色相关子句(如
WITH ADMIN OPTION)只在 8.0 出现,5.7 解析器遇到就崩溃
这意味着:基于正则提取权限语句的运维工具,在混合环境中极易漏权限、误判角色归属,甚至因无法解析而中断执行。真实生产中,这类问题往往在上线后才暴露——因为测试库用的是单版本,而灰度环境混用了主从或不同小版本。


















