C#连接MySQL 8.0+报Authentication failed,根本原因是服务器默认使用caching_sha2_password插件,而旧版MySql.Data驱动(8.0.22前)不支持;推荐用MySqlConnector并添加SslMode=None;Allow User Variables=True参数,或升级MySql.Data至8.0.22+并指定Authentication Method。

默认的 MySQL 8.0+ 连接会因认证插件不兼容直接报错 Authentication failed,不是密码错了,是驱动不认新默认的 caching_sha2_password 插件。
为什么 C# 用 MySqlConnector 或 MySql.Data 连 MySQL 8.0+ 会 Authentication failed
MySQL 8.0 默认把用户认证插件从 mysql_native_password 改成了 caching_sha2_password。而旧版 .NET MySQL 驱动(尤其是 MySql.Data 8.0.22 之前版本)默认不支持它,握手阶段就失败。
常见错误信息里带这些关键词:Authentication failed、Unknown authentication plugin 'caching_sha2_password'、Unable to connect to any of the specified MySQL hosts(实际是认证卡在中间)。
- 不是用户名或密码输错(先用命令行
mysql -u root -p确认能登) - 不是防火墙或端口问题(
telnet localhost 3306能通说明网络层 OK) - 根本原因是客户端驱动和服务器认证机制没对齐
两种可靠解法:改服务端配置 or 改连接字符串
优先推荐改连接字符串——不动数据库权限配置,也避免影响其他系统。但要注意驱动版本匹配。
- 用
MySqlConnector(推荐,开源活跃,原生支持caching_sha2_password):NuGet 安装MySqlConnector,连接字符串末尾加Allow User Variables=True;SslMode=none;即可,默认就能连 - 用官方
MySql.Data:必须升级到8.0.22+,并在连接字符串中显式指定Authentication Method=sha256_password或Authentication Method=mysql_native_password - 如果非要用老版
MySql.Data(比如 6.x/7.x),只能让服务端降级用户插件:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES;
连接字符串里这几个参数不能少
哪怕只是本地开发,漏掉关键参数也会触发奇怪的超时或认证失败。以下字段建议显式写出:
-
Server=localhost(别用127.0.0.1,某些 IPv6 场景下行为不一致) -
Port=3306(显式写上,避免驱动读取 my.cnf 的歧义) -
Database=your_db(空库名可能导致部分驱动初始化异常) -
SslMode=None(开发环境没配证书时必须关 SSL,否则握手失败) -
Allow User Variables=True(MySqlConnector必须开,否则含@var的 SQL 报错)
完整示例(MySqlConnector):
Server=localhost;Port=3306;Database=testdb;Uid=root;Pwd=123456;SslMode=None;Allow User Variables=True;
查不到引用或编译失败?检查 NuGet 包冲突
项目里同时存在 MySql.Data 和 MySqlConnector 会导致类型混淆,比如 MySqlCommand 冲突、MySqlConnection 找不到构造函数。
- 删掉所有
MySql.Data相关包(包括间接依赖),只留MySqlConnector - 代码里 using 必须是
using MySqlConnector;,不是MySql.Data.MySqlClient - 如果用 Dapper,确认安装的是
Dapper.MySqlConnector,不是老的Dapper.MySql - .NET 6+ 项目注意 TargetFramework 兼容性:
MySqlConnector2.2+ 支持 net6.0,但 2.1 及更早只到 netstandard2.0
最常被忽略的一点:MySQL 用户权限里 host 是 'user'@'localhost',但 C# 用 Server=127.0.0.1 连时,MySQL 认为这是 'user'@'127.0.0.1',权限不匹配——要么建两个用户,要么统一用 localhost。


















