MySQL 8.0+废弃GRANT中使用IDENTIFIED BY语法,导致ERROR 1064或1410;必须分两步:先CREATE USER指定密码,再GRANT授予权限,且不可在GRANT中含IDENTIFIED BY。

GRANT 报 ERROR 1064 或 ERROR 1410,大概率是写了 IDENTIFIED BY
MySQL 8.0 彻底移除了 GRANT 语句中创建用户的语法支持。只要你在 GRANT 里写了 IDENTIFIED BY,就会触发 ERROR 1064(语法错误)或 ERROR 1410(You are not allowed to create a user with GRANT)。这不是权限不足、密码格式错或主机名写法问题,而是语法本身被拒绝。
典型错误写法包括:
GRANT ALL ON *.* TO 'u1'@'%' IDENTIFIED BY 'pwd123';GRANT SELECT ON db1.* TO 'u2'@'localhost' IDENTIFIED BY 'abc';
这些在 MySQL 5.7 及以前能跑通,但在 8.0+ 直接报错。
确认当前 MySQL 版本是否为 8.0+
别凭印象判断——有些 Docker 镜像、云数据库默认已是 8.0,而你本地开发环境可能还是 5.7。执行这条命令看准版本:
SELECT VERSION();
如果返回类似 8.0.33、8.3.0 这样的结果,就坐实了必须分步操作。注意:即使你用的是 Percona 或 MariaDB 分支,只要底层协议/语法兼容 MySQL 8.0,同样适用该规则。
正确做法:CREATE USER + GRANT 分开执行
两步缺一不可,顺序不能颠倒,且 GRANT 中绝不能带 IDENTIFIED BY:
- 先创建用户(含密码):
CREATE USER 'u1'@'%' IDENTIFIED BY 'pwd123'; - 再授予权限(不带密码):
GRANT SELECT, INSERT ON mydb.* TO 'u1'@'%'; - 如需全局权限,用:
GRANT ALL PRIVILEGES ON *.* TO 'u1'@'%'; - 最后刷新(部分场景可省,但建议加上):
FLUSH PRIVILEGES;
注意:若用户已存在,CREATE USER 会报错;此时应改用 ALTER USER 修改密码,例如:ALTER USER 'u1'@'%' IDENTIFIED BY 'newpwd';
容易忽略的认证插件兼容性问题
即使语法全对,仍连不上?可能是新用户用了 caching_sha2_password 插件,而客户端(尤其是旧版 MySQL Workbench、某些 JDBC 驱动、PHP mysqli)不支持。这时会表现为“连接成功但认证失败”或“Access denied for user”。解决方法有两个:
- 创建用户时显式指定插件:
CREATE USER 'u1'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123'; - 或全局降级默认插件:在
my.cnf中加一行default_authentication_plugin=mysql_native_password,然后重启 mysqld
这个点常被跳过,直到应用连不上才回头排查,其实应该在创建第一个 8.0 用户时就决定好插件策略。











