错误本质是客户端不支持MySQL 8.0+默认的caching_sha2_password认证插件,需执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd';并FLUSH PRIVILEGES;修复。

为什么连接MySQL时会报 Client does not support authentication
这个错误本质是客户端(比如 MySQL 5.7 客户端、旧版 JDBC 驱动、PHP mysqlnd)不支持服务端默认启用的 caching_sha2_password 认证插件。MySQL 8.0.4+ 默认用它替代了老的 mysql_native_password,但很多旧客户端压根不认识这个插件,握手阶段就直接断开。
检查当前用户的认证插件类型
连上 MySQL(可用 root 或其他能登录的账号),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
如果返回的 plugin 是 caching_sha2_password,而你的客户端又较老(比如 MySQL 5.6 命令行、Django 2.2 默认配置、某些 Node.js mysql2 低版本),基本就是它导致的。
- 注意:
host字段必须匹配——'user'@'localhost'和'user'@'%'是两个不同用户 - 不要只查
user,漏掉host容易误判
临时或长期修复:改回 mysql_native_password
最直接的解法是把用户认证方式切回兼容性更好的 mysql_native_password:
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
然后刷新权限:
FLUSH PRIVILEGES;
- 如果用户是
'user'@'%',记得把localhost换成% - 部分旧客户端(如 phpMyAdmin 4.x)即使改了插件,仍需重启 web 服务器或 PHP-FPM 才能重载连接配置
- 不建议全局修改
default_authentication_plugin配置项,会影响新用户创建逻辑,且掩盖了客户端升级需求
升级客户端比降级服务端更可持续
硬切回 mysql_native_password 是权宜之计。真正该做的,是确认你用的客户端是否支持 caching_sha2_password:
- MySQL 命令行:8.0.4+ 客户端原生支持;5.7 及更早版本不支持
- JDBC:需用
mysql-connector-java 8.0.11+,并确保 URL 含?serverTimezone=UTC(否则可能报其他时区错) - Python mysqlclient:不支持;应换用
PyMySQL或mysql-connector-python8.0+ - Docker 环境里常被忽略的是镜像基础系统自带的 MySQL 客户端版本,比如
python:3.8-slim里的 client 往往还是 5.7
真正麻烦的不是改 SQL,而是客户端散落在构建链、CI 脚本、容器镜像、本地开发环境里,漏掉一个就复现一次报错。











