95%的Navicat连接失败是因MySQL 8.0默认使用caching_sha2_password认证插件,而Navicat 12及更早版本仅支持mysql_native_password;需通过SELECT user,host,plugin FROM mysql.user确认插件类型,并用ALTER USER配合BY指定密码及FLUSH PRIVILEGES生效,同时注意localhost与127.0.0.1区别、Navicat缓存及密码特殊字符问题。
直接结论:95% 的 navicat 连接失败,是因为 mysql 8.0 默认用 caching_sha2_password,而你的 navicat(尤其是 12 或更早版本)只认 mysql_native_password —— 不是密码错,是“语言不通”。
怎么确认真是这个原因?
登录 MySQL 命令行(用 root 或有权限账户),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看 plugin 列。如果显示 caching_sha2_password,且你连的是 'root'@'localhost'、'root'@'127.0.0.1' 或 'root'@'%' 中的任意一个,那基本就是它了。注意:localhost 和 127.0.0.1 在 MySQL 里是两个完全独立的用户,不能互相替代。
ALTER USER 必须带密码,否则会锁死自己
很多人执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password; 就以为完事了——这会清空密码,导致下次连不进数据库。
- 改本地连接:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 改 127.0.0.1 连接(Navicat 默认走这个):
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 改远程连接:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 改完必须立刻执行:
FLUSH PRIVILEGES;,否则不生效
my.cnf 配置只影响新用户,对老用户无效
在 [mysqld] 段加 default_authentication_plugin=mysql_native_password 并重启 MySQL,确实能让后续新建的用户自动用旧插件,但已存在的用户(比如 root)的 plugin 字段不会变。云数据库(如阿里云 RDS)通常还禁止修改配置文件,这条路根本走不通。
另外,Docker 启动时加 --default-authentication-plugin=mysql_native_password 也是一样效果:只管新人,不管老人。
Navicat 自己也在“捣乱”
即使服务端改好了,Navicat 还可能连不上,常见原因有:
- 没关掉 Navicat 重开,它还在用缓存的旧握手参数重试
- 连接时填的是
localhost,但你只改了'root'@'127.0.0.1',漏掉了'root'@'localhost' - 密码里含
@、/、\等字符,Navicat 解析 URL 时出错,建议先换纯字母数字密码验证是否通
最容易被忽略的,其实是 host 匹配和 Navicat 缓存这两点——它们比插件切换本身更常导致“明明改了却还是连不上”。


















