Asp.Net Core读取MySQL数据库变音符号显示异常求助
看你的描述,写入数据时变音符号正常,但读取时出现乱码,结合你的技术栈(ASP.NET Core 2.0.5 + MySql.Data.EntityFrameworkCore 8.0.11),我整理了几个关键的排查和修复步骤:
1. 检查数据库与表的字符集配置
首先要确认你的MySQL数据库和Mandant表是否使用了utf8mb4字符集——MySQL原生的utf8实际上是utf8mb3,仅支持部分Unicode字符,而utf8mb4才是完整的UTF-8实现,更适配含变音符号的场景:
- 查看数据库默认字符集:
SELECT @@character_set_database, @@collation_database; - 查看表和字段的字符集配置:
SHOW CREATE TABLE Mandant;
如果表或MandantName字段的字符集不是utf8mb4,执行以下语句修改:
ALTER TABLE Mandant CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 修正连接字符串的字符集参数
把连接字符串中的CharSet=utf8替换为CharSet=utf8mb4,确保驱动用完整的UTF-8编码传输数据:
server=192.168.2.230;userid=tester;pwd=test;port=3306;database=Mandanten;sslmode=none;CharSet=utf8mb4;
3. 修复EF Core驱动版本兼容性问题
这大概率是核心问题:你使用的MySql.Data.EntityFrameworkCore 8.0.11和ASP.NET Core 2.0.5不兼容。Oracle的MySQL EF Core驱动8.0.x系列是为EF Core 2.1及以上版本设计的,而ASP.NET Core 2.0对应的EF Core版本是2.0,版本不匹配会导致编码处理等底层逻辑异常。
建议你降级驱动到适配EF Core 2.0的版本,比如MySql.Data.EntityFrameworkCore 2.0.8(通过NuGet包管理器安装即可)。如果愿意切换更稳定的第三方驱动,也可以尝试Pomelo.EntityFrameworkCore.MySql,它对ASP.NET Core的兼容性更好,针对2.0版本可安装Pomelo.EntityFrameworkCore.MySql 2.0.1,配置方式如下:
services.AddDbContext<YourDbContext>(options => options.UseMySql(Configuration.GetConnectionString("YourConnectionString")));
4. 显式配置EF Core的字符集行为
如果调整版本后仍有问题,可以在DbContext配置中强制指定字符集行为:
services.AddDbContext<YourDbContext>(options => options.UseMySQL(Configuration.GetConnectionString("YourConnectionString"), mysqlOpts => mysqlOpts.CharSetBehavior(CharSetBehavior.NeverAppend) .CharSet(CharSet.Utf8Mb4)));
这会避免驱动自动追加不兼容的字符集参数,确保数据传输编码统一。
按照这些步骤逐一排查,应该就能解决变音符号读取乱码的问题了。
内容的提问来源于stack exchange,提问作者Yobikir

