ERROR 1396主因是用户host不匹配导致残留,如DROP USER 'test'仅删'@localhost'而'@%'仍存在;应先SELECT user,host查全量,再显式DROP所有host变体,最后CREATE USER。

为什么DROP USER后CREATE USER仍报ERROR 1396
直接执行 DROP USER 后立刻 CREATE USER 报错,大概率不是命令本身问题,而是你删的用户 host 不匹配。MySQL 把 'user'@'localhost' 和 'user'@'%' 当作两个完全不同的用户。如果之前用 DROP USER 'test'(没写 host),实际只删了 'test'@'localhost',而残留的 'test'@'%' 仍在 mysql.user 表里,这时再建 'test'@'localhost' 就会触发 ERROR 1396。
检查残留用户的正确方式
别只查 SELECT user FROM mysql.user,必须带上 host:
SELECT user, host FROM mysql.user WHERE user = 'test';
常见坑点:
- 结果里出现多行同名 user、不同 host(比如
test出现在localhost、127.0.0.1、%三行) -
DROP USER 'test'实际只删第一行(默认 localhost),其余仍存在 - 用
DELETE FROM mysql.user WHERE user = 'test'更危险:不触发内部清理逻辑,且不会自动刷新权限缓存
安全删除并重建用户的操作顺序
按这个顺序做,基本不会卡在 1396:
- 先确认要删的完整账号:
SELECT user, host FROM mysql.user WHERE user = 'test';</li> <li>逐个显式删除:<code>DROP USER 'test'@'localhost', 'test'@'%', 'test'@'127.0.0.1';
- 立即验证是否清空:
SELECT user, host FROM mysql.user WHERE user = 'test';(应返回空) - 再创建:
CREATE USER 'test'@'localhost' IDENTIFIED BY 'pwd123';
注意:MySQL 8.0 默认密码插件是 caching_sha2_password,如果客户端不支持(比如老版本 Navicat),创建后还需补一句:ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123';
为什么FLUSH PRIVILEGES有时无效
FLUSH PRIVILEGES 对 DROP USER 或 CREATE USER 本身不必要——这两个命令已自动刷新内存权限表。它只对直接修改 mysql.user 表(如 UPDATE 或 DELETE)后的状态同步有效。如果你用了 DELETE FROM mysql.user,就必须跟 FLUSH PRIVILEGES;但只要全程用 DROP USER 和 CREATE USER,就不用手动刷。
真正容易被忽略的是 host 的通配细节和 caching_sha2_password 兼容性,这两点比权限刷新更常导致 1396 复现。


















