直接改服务端用户认证插件为mysql_native_password是最常用、最稳妥的方式,需对目标用户执行alter user 'user'@'host' identified with mysql_native_password by 'pwd';并立即flush privileges,云数据库也仅支持此法。

直接改服务端用户认证插件为 mysql_native_password——90% 的情况是 MySQL 8.0 默认用了 caching_sha2_password,而你的 Navicat、mysql npm 包、PyMySQL 或旧版 PHP mysqli 根本不认这个协议。
查当前用户的 authentication plugin 是不是 caching_sha2_password
用能连上的方式(比如本地命令行 mysql -u root -p)登录后执行:
SELECT host, user, plugin FROM mysql.user WHERE user = 'your_user';
重点关注你实际连接用的那条记录。常见坑点:
-
host是'localhost'和'%'是两套独立账户,插件可以不同,必须分别检查 - 别只看
root,应用代码里连的是哪个用户,就查哪个 - 如果
plugin列值是caching_sha2_password,基本坐实问题根源 - 错误码如
1251(Navicat)、ER_NOT_SUPPORTED_AUTH_MODE(Node.js)都指向这里
用 ALTER USER 切回 mysql_native_password
对出问题的用户执行一条语句即可,例如:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
关键细节:
- 必须带单引号,
'root'@'localhost'是完整标识符,写成root@localhost会报错 - 如果是远程连接(比如云服务器),
host很可能是'%',得改成'root'@'%' - 密码明文写在语句里,确保和你要在客户端填的一致
- 执行完建议立刻补一句
FLUSH PRIVILEGES;,虽然多数情况自动生效,但保险起见
云数据库(阿里云 RDS / 腾讯云 CDB)怎么处理
这些平台通常禁用 my.cnf 全局修改,只能走 ALTER USER 这条路:
- 不能在配置文件里加
default_authentication_plugin=mysql_native_password - 也不能手动加载
mysql_native_password.so插件(权限受限) - 必须用已有高权限账号(如
root)登录后,对目标用户逐个执行ALTER USER ... IDENTIFIED WITH mysql_native_password - 注意:RDS 控制台的“账号管理”页一般不暴露
plugin字段,仍需进命令行查
最容易被忽略的是 host 匹配精度——'user'@'localhost' 和 'user'@'%' 是两个完全独立的账户,插件、密码、权限互不影响;连不上时,得挨个确认,而不是只改其中一个。











