先用mysql命令行执行select user, host, plugin from mysql.user where user = 'your_user',若plugin列为caching_sha2_password且navicat为12/15早期版等旧客户端,则确认为此问题;须对'your_user'@'127.0.0.1'等对应host执行alter user ... identified with mysql_native_password by 'pwd'并flush privileges生效。

怎么确认真是 caching_sha2_password 搞的鬼
别急着改配置,先登录 MySQL 命令行(比如用 mysql -u root -p),执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
把 your_user 换成你 Navicat 里填的那个用户名。重点看 plugin 列:如果值是 caching_sha2_password,且你用的是 Navicat 12/15 早期版、旧版 PyMySQL 或 JDBC 驱动,那基本就是它了。
特别注意:'user'@'localhost'、'user'@'127.0.0.1'、'user'@'%' 是三个完全独立的账号——Navicat 默认走 127.0.0.1,但很多人只查或只改了 localhost 就以为完事。
ALTER USER 必须带 host 和密码,否则直接锁死账号
这是最常踩的坑:只写 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password; 会清空密码哈希,导致账号彻底无法登录。
正确写法必须包含三要素:用户名+主机、认证插件、明文密码:
ALTER USER 'app_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'real_pass';-
ALTER USER 'app_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'real_pass';(Navicat 默认走这条) -
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'real_pass';(远程连接用)
漏掉单引号、写错 host、少 BY 后面的密码,都会报错 ERROR 1827 或改错账号。
FLUSH PRIVILEGES 不是可选项,是生效前提
MySQL 的权限系统有内存缓存。ALTER USER 只更新磁盘表,不刷新运行时状态。不执行 FLUSH PRIVILEGES;,Navicat 仍按旧插件握手,错误照旧。
执行后无输出即成功;出现 Query OK 表示已加载。不需要重启 mysqld,也不依赖是否在 USE mysql; 下执行。
云数据库(如阿里云 RDS)尤其要显式执行这句——改配置文件根本没用,ALTER USER + FLUSH PRIVILEGES 是唯一路径。
Navicat 自己也在“卡壳”,连对了也连不上
服务端改完,Navicat 还可能连不上,常见原因有:
- 没关掉 Navicat 重开,它还在用缓存的旧握手参数重试
- 连接时填的是
localhost,但你只改了'root'@'127.0.0.1',漏掉了'root'@'localhost' - 密码含
@、/、\等字符,Navicat 解析连接 URL 时出错 - Windows 下
localhost默认走命名管道,若 MySQL 未启用该协议,会 fallback 失败——直接填127.0.0.1强制走 TCP 更稳
改完别急着连,先回 MySQL 执行一遍 SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';,确认 plugin 真变成 mysql_native_password 再试。











