Django默认不支持MySQL 8.0的caching_sha2_password认证插件,因mysqlclient仅兼容mysql_native_password;解决方法是执行ALTER USER...IDENTIFIED WITH mysql_native_password并FLUSH PRIVILEGES,或改用mysql-connector-python驱动。

mysqlclient 并填对账号密码大概率会报 Authentication plugin 'caching_sha2_password' cannot be loaded 错误。必须调整 MySQL 用户认证方式或换驱动。
为什么 mysqlclient 在 MySQL 8.0 上连不上
MySQL 8.0 默认用 caching_sha2_password 加密插件,而 mysqlclient(基于 C 的旧驱动)只认老式的 mysql_native_password。这不是 Django 配置问题,是底层协议不兼容。
常见错误现象包括:
-
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module(没装好驱动) -
Authentication plugin 'caching_sha2_password' cannot be loaded(已装但认证失败) -
Can't connect to local MySQL server through socket(HOST/PORT 错,或 mysqld 没跑)
改 MySQL 用户认证方式(推荐给开发环境)
进 MySQL 命令行(用 root 登录),执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123321';
然后刷新权限:
立即学习“Python免费学习笔记(深入)”;
FLUSH PRIVILEGES;
这样 mysqlclient 就能正常握手。注意:这个操作只影响指定用户,不影响其他用户或全局配置。
验证是否生效:
提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
确认第三列返回的是 mysql_native_password,不是 caching_sha2_password。
settings.py 中 DATABASES 配置要点
改完认证后,DATABASES 字典里必须包含这些字段,缺一不可:
-
'ENGINE': 'django.db.backends.mysql'—— 不是mysqlclient,是 Django 内置的后端标识 -
'NAME'必须是已存在的数据库名(不能自动创建),比如'lice_management' -
'HOST'推荐写'127.0.0.1',别用'localhost'(Unix socket 和 TCP 行为不同) -
'PORT'写整数3306,不是字符串'3306'(Django 会强转,但留着字符串容易在某些版本出错) - 不需要加
?charset=utf8mb4或时区参数 —— Django 会自动发SET NAMES utf8mb4和SET TIME_ZONE
正确示例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'lice_management',
'USER': 'root',
'PASSWORD': '123321',
'HOST': '127.0.0.1',
'PORT': 3306,
}
}
装 mysqlclient 的实际难点和绕过方案
Windows 下 pip install mysqlclient 经常失败,因为需要编译 C 扩展、依赖 VC++ 构建工具和 MySQL client headers。
可行做法:
- 去 https://www.php.cn/link/8bcd446a0b16ce6dbefa3acf438dc512 下载对应 Python 版本 + 系统位数的
.whl文件(如mysqlclient‑2.2.4‑cp311‑cp311‑win_amd64.whl),然后pip install xxx.whl - 或者干脆换用
mysql-connector-python(官方纯 Python 驱动,支持caching_sha2_password):
→ 改ENGINE为'mysql.connector.django'
→pip install mysql-connector-python
→ 不用改 MySQL 用户认证方式
注意:pymysql 虽然也能用,但需额外加两行 monkey patch(在 __init__.py 里 import 并调用 pymysql.install_as_MySQLdb()),且性能略低,不推荐新项目用。
mysql -u root -p 能登进命令行,再查 plugin 字段,最后才碰 Django 配置 —— 顺序错了,排查就全乱。


















