MySQL 8.0 中 GRANT 语句报错主因是语法变更:IDENTIFIED BY 被移除,用户创建与授权必须分离;需先 CREATE USER(含认证插件),再 GRANT;库名含数字或特殊字符须加反引号。

GRANT 语句在 MySQL 8.0 中自动报错,绝大多数情况不是权限不足,而是语句本身已不合法——核心原因是用户创建与权限授予被强制拆分为两个独立步骤,且 IDENTIFIED BY 语法已被彻底移除。
GRANT 报 ERROR 1064:IDENTIFIED BY 不再被识别
MySQL 8.0 的 SQL 解析器直接拒绝包含 IDENTIFIED BY 的 GRANT 语句。哪怕你只是复制了 5.7 的旧脚本,执行就会立刻中断:
GRANT ALL PRIVILEGES ON *.* TO 'u'@'%' IDENTIFIED BY 'pwd';
错误信息明确指向 IDENTIFIED BY 关键字:
ERROR 1064 (42000): You have an error in your SQL syntax; [...] near 'IDENTIFIED BY' at line 1
- 这不是兼容性警告,是语法路径被硬性删除
-
CREATE USER负责身份(密码、插件、过期策略),GRANT只管权限分配 - 想建户+赋权,必须写两行:
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';+GRANT ALL PRIVILEGES ON *.* TO 'u'@'%';
GRANT 报 ERROR 1410:You are not allowed to create a user with GRANT
即使你没写 IDENTIFIED BY,只要目标用户(如 'u'@'%')在 mysql.user 表中不存在,GRANT 就会直接拒绝并抛出该错误。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- MySQL 8.0.16 起彻底禁用隐式建户能力,
GRANT不再“顺手”帮你注册账户 - 必须先确保用户存在:
CREATE USER IF NOT EXISTS 'u'@'%';(注意:不带密码也可,适用于 OS 认证等场景) - 执行
GRANT的当前登录用户(如'admin'@'10.0.1.%')必须拥有CREATE USER权限和GRANT OPTION,否则连验证用户是否存在这一步都会失败
库名含数字或特殊字符时,GRANT 报语法错但提示模糊
当数据库名是纯数字(如 12345)、含中划线(如 my-db)或撞上关键字(如 order),不加反引号会导致解析失败,错误仍归为 ERROR 1064,但提示位置可能误导人。
- 错误写法:
GRANT SELECT ON 12345.* TO 'u'@'%';→ 直接报错 - 正确写法:
GRANT SELECT ON `12345`.* TO 'u'@'%';或GRANT SELECT ON `my-db`.* TO 'u'@'%'; -
`是英文键盘 Esc 下方的反引号,不是单引号'
认证插件不匹配导致“能连但 GRANT 后连不上”
即使 CREATE USER 和 GRANT 都成功,老客户端(PyMySQL ERROR 1251 或 ERROR 2058。
- MySQL 8.0 默认用
caching_sha2_password插件,但这些客户端只认mysql_native_password - 创建用户时必须显式指定:
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; -
ALTER USER 'u'@'%' IDENTIFIED BY 'new'会悄悄重置插件为默认值,必须写全:ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'new';
真正容易被忽略的不是语法本身,而是 host 匹配、插件声明、角色激活(SET DEFAULT ROLE)、以及从库是否跳过了 mysql 库的复制——这些细节一旦出错,现象都是“GRANT 成功但权限不生效”,排查时极易绕远路。

















