MySQL 8.0 默认认证插件为caching_sha2_password,旧版PyMySQL/MySQLdb不支持该协议;应优先执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'并FLUSH PRIVILEGES。

MySQL 8.0 默认认证插件不被旧版 PyMySQL/MySQLdb 支持
Python 连接 MySQL 8.0+ 时抛出 caching_sha2_password 错误,根本原因是:MySQL 8.0 默认使用 caching_sha2_password 认证插件,而老版本的 PyMySQL(mysqlclient(MySQLdb 根本不识别该插件,直接拒绝握手。
这不是密码错,也不是权限问题——是底层认证协议不兼容。常见错误信息包括:
Authentication plugin 'caching_sha2_password' cannot be loaded
mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported
- 检查 MySQL 版本:
SELECT VERSION(); - 检查用户认证插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'; - 若返回
caching_sha2_password,且 Python 驱动较旧,就必然触发此错误
优先升级 Python 驱动(推荐方案)
新版驱动已原生支持 caching_sha2_password,无需改服务端配置,最安全、最可持续。
-
PyMySQL:升级到>=1.0.2(注意:0.10.x 虽支持但有 handshake bug,跳过)pip install --upgrade PyMySQL -
mysqlclient:升级到>=2.0.0(需编译环境,Windows 用户建议用pip install mysqlclient直接装 wheel) -
mysql-connector-python:升级到>=8.0.18,并显式指定auth_plugin='caching_sha2_password'(部分旧版仍需)
连接示例(PyMySQL):
立即学习“Python免费学习笔记(深入)”;
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
import pymysql<br>conn = pymysql.connect(<br> host='localhost',<br> user='root',<br> password='xxx',<br> database='test',<br> charset='utf8mb4'<br>)
✅ 升级后无需任何参数调整,自动协商认证方式。
临时降级 MySQL 用户认证插件(仅限开发/测试环境)
如果无法立刻升级驱动(如依赖闭源包、CI 环境受限),可临时把用户认证方式切回 mysql_native_password。但这是权宜之计,不适用于生产环境。
- 登录 MySQL(用 root 或高权限账号):
mysql -u root -p - 执行(替换
your_user和your_host):ALTER USER 'your_user'@'your_host' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 立即生效,无需重启 MySQL,但需刷新权限:
FLUSH PRIVILEGES;
⚠️ 注意:your_host 必须完全匹配(如 'localhost' ≠ '127.0.0.1'),否则仍连不上;密码会重置,务必同步更新 Python 代码里的 password 参数。
避免踩坑的关键细节
很多问题其实卡在看似无关的环节:
- Mac 上用 Homebrew 装的 MySQL,默认配置文件可能启用
default_authentication_plugin = caching_sha2_password,即使降级了用户,新创建用户仍会继承——要改my.cnf并重启 mysqld - 某些 Docker 镜像(如
mysql:8.0)首次启动时生成 root 密码,且 root 用户默认就是caching_sha2_password,必须进容器手动改 -
sqlalchemy用户注意:URL 中不能加?auth_plugin=caching_sha2_password(PyMySQL 不认),那是mysql-connector-python的写法;PyMySQL 下只需确保驱动版本够新 - Windows 上
mysqlclient编译失败?优先用pip install --only-binary=all mysqlclient强制走预编译 wheel
真正麻烦的从来不是选升级还是降级,而是没意识到 MySQL 用户的 host 是精确匹配的,或者以为改了 root 就万事大吉,结果应用连的是另一个同名但 host 不同的用户。


















