MySQL 8.0 默认认证插件为 caching_sha2_password,旧版 MySql.Data(如 v8.0.12 前)不支持,导致连接报错;可改用户插件为 mysql_native_password 或升级驱动至 v8.0.28+ 并启用 SSL。

MySQL 8.0 默认用 caching_sha2_password,而旧版 MySql.Data(如 8.0.12 之前)不支持它,直接报错“Authentication plugin 'caching_sha2_password' cannot be loaded”。
确认当前用户的认证插件
先登录 MySQL 命令行(mysql -u root -p),查你正在用的用户实际走的是哪个插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
如果返回结果里 plugin 是 caching_sha2_password,且你用的是 .NET Framework + MySql.Data 早期版本(比如 NuGet 上 v6.x、v7.x 或未更新的 v8.0.12 以下),那基本就是它了。
- 注意:不是所有
MySql.Datav8.x 都默认支持新插件——有些老编译版本即使标着 v8.0.x,内部也未启用 SHA-256 支持 -
localhost和127.0.0.1在权限表里是两个不同host,查的时候别漏掉
改用户插件为 mysql_native_password
执行 ALTER USER 切换认证方式,保留原密码不变:
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
如果是远程连接,把 'localhost' 换成对应 host,比如 '%' 或具体 IP;改完必须刷新:
FLUSH PRIVILEGES;
- 这个操作只影响指定用户,不影响其他用户,适合线上环境局部修复
- 不要在生产环境对
root直接改,建议新建一个专用应用用户再改 - 改完可用
mysql -u your_username -p -h 127.0.0.1测试是否能连上
升级 MySql.Data 并启用 SSL(推荐长期方案)
如果你能控制项目依赖,更安全的做法是升级驱动并显式启用兼容配置:
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- NuGet 安装
MySql.Data≥ v8.0.28(已完整支持caching_sha2_password) - 连接字符串里加
SSL Mode=Preferred或SSL Mode=Required(MySQL 8.0 默认强制 SSL,不加可能触发握手失败) - 若服务端没配证书,可临时加
Allow User Variables=True;AllowPublicKeyRetrieval=True(仅调试用,勿上线)
示例连接字符串:
Server=127.0.0.1;Port=3306;Database=test;Uid=user;Pwd=pass;SSL Mode=Preferred;Allow User Variables=True;
注意:AllowPublicKeyRetrieval=True 会绕过公钥交换校验,在公网环境有中间人风险,仅限内网调试阶段临时开启。
避免踩坑的细节
很多连接失败其实卡在看似无关的地方:
- Windows 下用
localhost连接时,.NET 默认走命名管道或共享内存,而不是 TCP;改成127.0.0.1强制走 TCP,能避开 socket 路径和插件解析的双重干扰 - 某些 CI/CD 环境或 Docker 容器里,MySQL 启动后用户表还没初始化完就去连,会报插件加载失败——加个重试逻辑比硬切插件更稳
- 修改插件后,如果应用用了连接池(如 Dapper + SqlConnectionPool),得重启应用进程,否则旧连接仍缓存着失败状态
最易被忽略的一点:MySQL 8.0 的 caching_sha2_password 在无 SSL 通道下要求客户端提供公钥,而旧版 MySql.Data 不发也不处理——这不是配置问题,是协议层不对话。要么降插件,要么升驱动,没有中间态。










