跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

mysql 5.7与8.0的授权语法有哪些区别_对比GRANT语句自动创建用户的差异

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(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载 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 解析器遇到就崩溃 这意味着:基于正则提取权限语句的运维工具,在混合环境中极易漏权限、误判角色归属,甚至因无法解析而中断执行。真实生产中,这类问题往往在上线后才暴露——因为测试库用的是单版本,而灰度环境混用了主从或不同小版本。

相关文章