推荐使用 MySqlConnector,它是纯 .NET 实现、开源活跃、默认支持异步;避免 MySql.Data 在 .NET 6+ 的并发异常;密码含特殊字符须用 MySqlConnectionStringBuilder 自动编码;资源必须 using + async/await;EF Core 需用 Pomelo 提供程序并显式指定 ServerVersion。

用 MySqlConnector 还是 MySql.Data?选错驱动会连不上
推荐直接用 MySqlConnector,它是纯 .NET 实现、开源、维护活跃,且默认支持异步(OpenAsync()、ExecuteReaderAsync())。而 Oracle 官方的 MySql.Data 有已知 bug:在 .NET 6+ 上可能抛出 System.InvalidOperationException: This MySqlConnection is already in use,尤其在高并发或 EF Core 中容易触发。
安装方式:
dotnet add package MySqlConnector
不建议再用 MySql.Data,除非你被旧项目绑定且无法升级。
连接字符串里 password 含特殊字符怎么办?
MySQL 用户密码里如果含 @、/、:、? 等 URL 敏感字符,直接拼接连接字符串会导致解析失败,表现为 MySqlException: Unable to connect to any of the specified MySQL hosts 或解析出错的主机名。
正确做法是用 MySqlConnectionStringBuilder 构建:
var builder = new MySqlConnectionStringBuilder
{
Server = "127.0.0.1",
Port = 3306,
Database = "testdb",
UserID = "root",
Password = "p@ss/w?rd123" // 直接赋值,自动编码
};
string connStr = builder.ConnectionString;
不要手拼 "server=...;password=p@ss/w?rd;" —— 这是高频翻车点。
执行查询时忘了 await 或没用 using,资源就泄漏了
常见错误写法:connection.Open(); 后没包在 using 里,或调用 ExecuteReader() 却用了 await(同步/异步混用),导致连接不释放、线程卡死、连接池耗尽。
安全写法必须同时满足:
-
MySqlConnection、MySqlCommand、MySqlDataReader都用using(或using var)声明 - 异步方法统一走
async/await链路,不同步混用 - 连接字符串中显式设置
Pooling=true;Connection Timeout=10;
示例:
using var conn = new MySqlConnection(connStr);
await conn.OpenAsync();
using var cmd = new MySqlCommand("SELECT COUNT(*) FROM users", conn);
long count = (long)await cmd.ExecuteScalarAsync();
EF Core + MySQL 怎么配才不报错?
EF Core 6+ 不再原生支持 MySQL,必须搭配第三方提供程序。目前唯一稳定推荐的是 Pomelo.EntityFrameworkCore.MySql(注意不是 MySql.Data.EntityFrameworkCore,后者已废弃且不兼容 EF Core 5+)。
关键配置点:
- 安装包:
Pomelo.EntityFrameworkCore.MySql(版本需匹配 EF Core,如 EF Core 7 → 7.0.x) - 注册服务时用
UseMySql(),不是UseMySQL()(大小写敏感,拼错直接启动失败) - 连接字符串末尾加
ServerVersion,例如:...;ServerVersion=8.0.33-mysql;,否则报Unable to determine server version
Startup.cs 或 Program.cs 中:
services.AddDbContext<AppDbContext>(options =>
options.UseMySql(connStr, new MySqlServerVersion(new Version("8.0.33"))));
漏掉 MySqlServerVersion 是本地开发能跑、上线就崩的典型原因。
MySQL 的连接问题,八成出在驱动选择、连接字符串编码、异步/同步混用这三处。别信“随便找个 NuGet 包就能连”,每个环节都得对上版本和语义。


















