MySQL 8.0 禁止 GRANT 中使用 IDENTIFIED BY 创建用户,必须先 CREATE USER 再 GRANT;ERROR 1064 是语法解析失败,ERROR 1410 是语义上禁止隐式建户,二者均因强制拆分认证与授权机制所致。

MySQL 8.0 不再支持在 GRANT 语句里用 IDENTIFIED BY 创建用户,这不是配置问题或权限不足,而是解析器层面的硬性拦截 —— 语句直接不被接受。
ERROR 1410 和 ERROR 1064 的本质区别
两者都指向同一事实:你试图在 GRANT 中创建用户,但 MySQL 8.0 已彻底移除该能力。
-
ERROR 1064 (42000):语法解析失败,比如写了GRANT ... TO 'u'@'%' IDENTIFIED BY 'p',MySQL 根本不认识这个结构,连语义检查都不进 -
ERROR 1410 (42000):语法合法(比如没写IDENTIFIED BY),但目标用户不存在,GRANT拒绝隐式建户 —— 即使你是'root'@'localhost'也一样被拦
CREATE USER 必须显式指定认证插件
默认插件 caching_sha2_password 会导致老客户端(如旧版 Navicat、JDBC 8.0 之前驱动、PHP mysqli)连接时只报 Access denied,不提示插件不兼容。
- 安全且兼容的写法:
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p' - 如果省略
IDENTIFIED WITH,MySQL 会用默认插件,但后续连接可能静默失败 -
'u'@'localhost'和'u'@'127.0.0.1'是两个独立账户,socket 连接和 TCP 连接走不同路径,host 必须严格匹配
GRANT 后权限不生效?先查这三件事
执行完 GRANT 却仍连不上或报 Access denied,大概率不是权限没给,而是以下环节出错:
- 执行
GRANT的当前用户(如'admin'@'10.0.1.%')必须同时拥有CREATE USER权限(用于验证用户是否存在)和GRANT OPTION(用于授予权限) - 若要给
'u'@'192.168.1.100'授权,而你是用'root'@'localhost'登录的,MySQL 会拒绝 ——'root'@'localhost'默认无权跨 host 管理其他用户 - 角色绑定后不会自动激活:
GRANT 'role'@'%' TO 'u'@'%'成功了,但SELECT仍报错?缺了SET DEFAULT ROLE 'role'@'%' TO 'u'@'%'
最常被跳过的其实是 host 匹配和认证插件组合 —— 它们不出现在错误信息里,却决定连接能否建立。别急着重试密码或改权限,先确认 CREATE USER 的 host 和插件是否与客户端实际连接方式一致。


















