MySQL 8.0 连接报错“Authentication plugin 'caching_sha2_password' cannot be loaded”是因客户端不支持默认认证插件;应改用户认证方式为mysql_native_password,并在JDBC URL或pymysql中适配参数。
MySQL 8.0 连接报 Authentication plugin 'caching_sha2_password' cannot be loaded
这是最常见的一类报错,本质是客户端不支持 mysql 8.0 默认的身份验证插件。老项目用 mysql 5.7 的 mysql_native_password 没问题,一换 8.0 就连不上。
实操建议:
- 临时方案:启动 MySQL 时加
--default-authentication-plugin=mysql_native_password,或在配置文件my.cnf的[mysqld]下加这行 - 更稳妥的做法是改用户认证方式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - Java 应用要注意 JDBC URL 加上
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false,否则即使改了插件也可能卡在密钥交换阶段 - Python 的
pymysql默认不支持caching_sha2_password,得升级到 1.0+ 并显式指定auth_plugin='mysql_native_password'
Django 启动时报 10501, "Unknown character set: 'utf8mb4_0900_ai_ci'
MySQL 8.0 引入了新的 collation,默认字符集排序规则变了,而旧版 Django(如 2.x)的 django.db.backends.mysql 不识别这个新名字,直接抛异常。
实操建议:
- 检查
settings.py中OPTIONS是否有硬编码'charset': 'utf8mb4'—— 删掉它,让 Django 自动推导 - 确认数据库创建语句里没写死
COLLATE utf8mb4_0900_ai_ci,应改为COLLATE utf8mb4_unicode_ci或留空由 MySQL 8.0 默认处理 - Django 3.2+ 原生支持该 collation,若无法升级框架,可在
mysql配置中把collation-server设为utf8mb4_unicode_ci
SQL 语法在 MySQL 5.7 和 8.0 间不兼容:比如 GROUP BY 报错
MySQL 8.0 默认开启 sql_mode=ONLY_FULL_GROUP_BY,而很多老 SQL 写法(如 SELECT 字段未全在 GROUP BY 中)在 5.7 可跑,在 8.0 直接报错。
实操建议:
- 不要全局关掉
ONLY_FULL_GROUP_BY,容易掩盖逻辑缺陷;优先重构 SQL,确保所有非聚合字段都出现在GROUP BY列表中 - 如果必须兼容,可在连接初始化时执行
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));,但仅限测试环境 - ORM 场景下(如 SQLAlchemy),注意
.group_by()调用是否遗漏字段;Django 的values()+annotate()组合必须严格匹配
备份还原时 mysqldump 版本不一致导致的 DEFINER 或 ALGORITHM 错误
用 MySQL 5.7 的 mysqldump 导出再导入到 8.0,常遇到视图/存储过程因 DEFINER 用户不存在、或 ALGORITHM=UNDEFINED 被拒绝而失败。
实操建议:
- 导出时加
--skip-definer和--set-gtid-purged=OFF,避免权限和 GTID 相关干扰 - 导入前先执行
SET SESSION sql_log_bin = 0;(若非主从环境),防止 binlog 写入失败中断 - 若目标库已存在同名对象,
mysqldump默认不覆盖,需手动加--add-drop-table或先清库 - 特别注意:MySQL 8.0 不再支持
ALGORITHM=MERGE在某些视图场景,导出后需人工检查并替换为ALGORITHM=TEMPTABLE
版本差异最麻烦的不是报错本身,而是错误只在特定组合下触发——比如某个 Python 包用的是旧版 mysqlclient,另一个模块又依赖新版 pymysql,两者对同一 MySQL 8.0 实例的行为可能完全不同。这种隐性冲突,比明面上的语法报错更难定位。

















