MySQL 8.0 默认认证插件为 caching_sha2_password,导致旧客户端连接失败;应优先执行 ALTER USER 修改问题用户的认证插件为 mysql_native_password,并注意 host 和单引号格式。

这不是客户端太旧要升级,而是 MySQL 8.0 默认用了 caching_sha2_password 认证插件,而老客户端(如 Navicat 旧版、Node.js 的 mysql 包、Python 的 PyMySQL)压根不认这个协议。优先改服务端配置,别硬升客户端。
查当前用户的认证插件是啥
连上 MySQL(用能连上的方式,比如命令行本地登录),执行:
SELECT host, user, plugin FROM mysql.user;
重点关注 root 或你实际连接用的用户名那一行,如果 plugin 是 caching_sha2_password,就坐实了问题根源。
- host 是
'localhost'和'%'要分开看,不同 host 可能配了不同插件 - 别只查 root,你的应用连接用的是哪个用户,就查哪个
- Navicat 报错 1251、Node.js 报
ER_NOT_SUPPORTED_AUTH_MODE,基本都指向这里
用 ALTER USER 切回 mysql_native_password
对出问题的用户执行一条命令即可,比如你用 root 从本机连:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
如果是远程连接(比如 Navicat 连云服务器),host 很可能是 '%':
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 必须带单引号,
'root'@'localhost'是完整用户名标识,漏掉或写成root@localhost会报错 - 密码明文写在语句里,确保和你要用的连接密码一致
- 执行完立刻生效,但保险起见补一句
FLUSH PRIVILEGES; - 云数据库(阿里云 RDS、腾讯云 CDB)通常禁用全局配置,只能走这条 ALTER USER 路径
my.cnf 全局降级(慎用,仅限可控环境)
如果你管得了 MySQL 配置文件,且希望所有新用户默认用老协议,可以在 my.cnf 的 [mysqld] 段加:
default_authentication_plugin=mysql_native_password
然后重启 MySQL:
sudo systemctl restart mysql
- 只影响之后新建的用户,已有用户插件不变,还得单独
ALTER USER - 某些 Docker 镜像或云服务不允许改这个参数,强行加了也不生效
- 生产环境不建议开全局,容易干扰后续想用新协议的场景
真正麻烦的不是命令本身,而是容易忽略 host 的具体值、忘记给用户名加单引号、或者在云数据库上死磕配置文件——其实直接 ALTER USER 就够了。


















