应直接修改用户认证插件为mysql_native_password,避免调整全局配置或依赖客户端适配;MySQL 8.0+默认caching_sha2_password不被Navicat≤15及旧版JDBC兼容。

直接改用户认证插件,别碰全局配置,也别指望客户端自动适配。 MySQL 8.0+ 默认用 caching_sha2_password,但 Navicat ≤15、JDBC ERROR 2059 或 Authentication plugin 'caching_sha2_password' cannot be loaded,不是密码错,也不是网络问题。
先确认是不是它在作怪
用能连上的方式(比如 mysql -u root -p 本地登录)执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看 plugin 列。如果显示 caching_sha2_password,再核对你的客户端版本:
- Navicat ≤14/15?大概率是它
- JDBC 驱动是
mysql-connector-java:5.1.x或6.0.x?就是它 - PHP 的
mysqli扩展版本低于 7.4?就是它 - Python 用的是
PyMySQL < 2.0或没装cryptography?就是它
注意:'root'@'localhost' 和 'root'@'127.0.0.1' 是两个独立账户,'root'@'%' 是另一个,必须分别查、分别处理。
ALTER USER 必须写全 host,且不能省略 BY
只写 ALTER USER 'user' IDENTIFIED WITH mysql_native_password; 会清空密码,账户锁死。正确写法是:
- 改本地 socket 连接用户:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改 TCP 连接用户(Navicat 默认走这个):
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'MyPass123!'; - 改远程用户:
ALTER USER 'dev'@'%' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';
如果密码不变,可省略 BY,但必须保留 IDENTIFIED WITH;IDENTIFIED BY 单独出现会报错。
FLUSH PRIVILEGES 不是可选项,是必做动作
MySQL 8.0.16+ 权限缓存更严格,不执行就等于没改:
- 执行完
ALTER USER后,立刻跟上:FLUSH PRIVILEGES; - 某些环境(如宝塔、部分 Docker 镜像)还需手动重启 MySQL 服务,否则连接池仍复用旧状态
- Navicat、SQLyog 等图形工具不用重启软件,但得新建连接测试,旧连接不会刷新认证方式
如果提示 ERROR 1396 (HY000),说明该 'user'@'host' 根本不存在,得先 CREATE USER 'user'@'host' IDENTIFIED BY 'pwd'; 再改。
最容易漏掉的其实是主机名匹配和 FLUSH PRIVILEGES —— 改了插件但没刷权限,或以为改了 'root'@'localhost' 就够了,结果 Navicat 实际连的是 'root'@'127.0.0.1',照样报错。



















