应升级客户端驱动至兼容版本或修改用户认证插件为mysql_native_password:Java用Connector/J 8.0+,Python用PyMySQL ≥1.0,或执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'。

MySQL 8.0报“Authentication plugin 'caching_sha2_password' cannot be loaded”怎么办
这是最典型的旧驱动连接失败现象,根本原因不是密码错了,而是客户端根本不认识 MySQL 8.0 默认的认证协议。旧版驱动(如 mysql-connector-java 5.x、PyMySQL mysql_native_password,而 MySQL 8.0 安装后新建用户默认用的是更安全的 caching_sha2_password 插件。
- 先确认当前用户的认证插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username'; - 若插件列为
caching_sha2_password,且你暂不打算升级驱动,可临时改回兼容模式:ALTER USER 'your_username'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 执行后必须
FLUSH PRIVILEGES;才生效 - 注意:该操作会降低认证安全性,仅建议用于开发/测试环境;生产环境应优先升级驱动而非降级插件
Java项目里连不上MySQL 8.0:驱动类名和JAR包都得换
com.mysql.jdbc.Driver 这个类在 8.0+ 驱动中已被移除,继续用它会直接抛 ClassNotFoundException 或静默失败。哪怕你把 JAR 换成了 8.0 版本,但配置里还写老类名,照样连不上。
- 驱动 JAR 必须是
mysql-connector-java-8.0.x.jar(如 8.0.33),不能是 5.1.x 或 6.0.x - Spring Boot 2.4+ 默认已适配,但老项目需手动改:
driver-class-name: com.mysql.cj.jdbc.Driver - URL 中建议显式加时区参数,否则可能触发
serverTimezone错误:jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai - 如果仍报
Public Key Retrieval is not allowed,在 URL 后追加&allowPublicKeyRetrieval=true&useSSL=false(仅限内网调试)
PyMySQL / mysqlclient 连接失败:版本卡在 0.9.x 是主因
很多 Python 项目依赖 pip install pymysql,但默认装的是 0.9.3 —— 它完全不支持 caching_sha2_password。错误提示常为 Authentication plugin 'caching_sha2_password' is not supported,而不是“密码错误”。
- 升级到 PyMySQL ≥ 1.0:
pip install --upgrade pymysql - 或改用更稳定的
mysqlclient≥ 2.0:pip install --upgrade mysqlclient - 若用 SQLAlchemy,检查
create_engine的 URL 是否含?charset=utf8mb4,避免字符集协商失败 - 不推荐用
ALTER USER ... IDENTIFIED WITH mysql_native_password来迁就旧 PyMySQL,因为 0.9.x 还有其他协议兼容问题(如握手包长度)
Navicat / DBeaver / DBVisualizer 连不上:别只改密码,重点看驱动管理
这些 GUI 工具通常自带 JDBC 驱动,不会自动随 MySQL 升级。你改了用户密码、甚至重装 Navicat,只要底层驱动没更新,问题照旧。尤其 DBVisualizer 默认用旧 Connector/J,必须手动添加新驱动并指定给连接使用。
- DBeaver:编辑连接 → “驱动设置” → 下载
mysql-connector-java-8.0.x.jar→ 替换现有驱动 → 在“驱动属性”里加allowPublicKeyRetrieval=true - Navicat 15+ 已内置兼容支持,但旧版(如 12.x)需手动更新驱动:帮助 → 关于 → 驱动文件夹 → 替换
mysql.jar - DBVisualizer:工具 → 驱动管理器 → 新建驱动 → 指向新 JAR → 编辑连接时在“驱动”下拉选它,而非默认项
- 切勿在工具里盲目勾选“忽略 SSL”或“跳过证书验证”,这掩盖的是协议不匹配,不是真正的 SSL 问题
真正麻烦的从来不是改一行 SQL 或加一个参数,而是多个组件间协议版本隐性耦合——驱动、ORM、连接池、GUI 工具各自维护自己的兼容边界。一旦其中一环卡在旧版本,整个链路就会在认证握手阶段无声中断。动手前先查清你实际在用哪个驱动、哪个类、哪个 JAR 文件路径,比反复试错高效得多。



















