不是密码错了,而是客户端不支持caching_sha2_password插件;需先用SELECT查用户plugin字段确认,再执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'并立即FLUSH PRIVILEGES,同时确保host精确匹配、客户端及驱动版本兼容。

不是密码错了,是客户端根本认不出 caching_sha2_password 这个插件——MySQL 8.0 默认改用它,但旧版 Navicat、JDBC 5.x、PHP 7.3 的 mysqli、Python 2 的 MySQLdb 都不支持。
查当前用户用了什么认证插件
连得上 root 就立刻执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'app_user';
如果 plugin 字段显示 caching_sha2_password 或 sha256_password,就确认是这个问题。注意:mysql.user 在 8.0 是只读视图,不能 UPDATE,只能用 ALTER USER 改。
ALTER USER 后仍连不上,三大常见漏点
执行了 ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd' 却还是报 ERROR 1251 或 SQLSTATE[HY000] [2054],大概率是以下其一:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 没执行
FLUSH PRIVILEGES:权限变更不会自动生效,连接池(如 HikariCP)可能还在用旧握手缓存 -
host不匹配:应用连的是'user'@'192.168.1.100',你却只改了'user'@'localhost';务必用SELECT user, host FROM mysql.user看真实来源 - 客户端没重启:老版 DBeaver、Navicat 会复用连接上下文,关掉重开比重启 MySQL 更有效
驱动版本比连接参数更重要
即使服务端已切回 mysql_native_password,驱动太旧照样握手失败——这不是配置问题,是协议层不支持:
- Java:必须用
mysql-connector-java≥ 8.0.12;5.1.x驱动连caching_sha2_password直接拒绝,加?allowPublicKeyRetrieval=true也无效 - PHP:需
mysqlnd≥ 8.0.0(对应 PHP ≥ 7.4);PHP 7.3 及更早版本无法协商新协议 - Python:停用已归档的
MySQLdb,改用pymysql或mysql-connector-python≥ 8.0.12
最容易被忽略的是:驱动不升级,只调服务端参数,会在连接池回收、长连接复用等场景偶发失败——错误不总在首次连接出现,而是在运行几小时后突然断连。










