C#通过MySQL Entity插入波斯文显示为????的问题求助
解决C# MySQL Entity插入波斯文显示为"????"的问题
从你的描述来看,数据库本身的UTF8mb4配置是没问题的——毕竟WordPress能正常插入和显示波斯文。问题出在你的C#代码与MySQL的连接/数据插入环节,没有正确指定UTF8mb4字符集,导致插入时编码转换错误。以下是具体的解决步骤:
1. 修正数据库连接字符串
这是最关键的一步,必须确保连接字符串明确指定使用utf8mb4字符集。修改后的连接字符串应该包含charset=utf8mb4参数:
string connectionString = "Server=你的服务器地址;Database=你的数据库名;Uid=用户名;Pwd=密码;charset=utf8mb4;";
如果使用Entity Framework Core,要确保将这个连接字符串传递给DbContext的配置项。
2. 配置DbContext的字符集行为
在你的DbContext类中,重写OnConfiguring方法,显式设置MySQL的字符集为utf8mb4,并避免自动追加其他字符集导致冲突:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseMySQL(connectionString, options => { // 指定字符集为utf8mb4 options.CharSet(CharSet.Utf8Mb4); // 禁止自动追加字符集到SQL语句中,避免覆盖手动配置 options.CharSetBehavior(CharSetBehavior.NeverAppend); }); }
3. 确保实体属性对应正确的数据库列类型
如果实体类中存储波斯文的属性,对应的数据库列没有明确绑定utf8mb4字符集,也可能引发编码问题。可以通过两种方式配置:
数据注解方式
public class YourEntity { public int Id { get; set; } [Column(TypeName = "varchar(255) CHARACTER SET utf8mb4")] public string PersianContent { get; set; } }
Fluent API方式
在DbContext的OnModelCreating方法中配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<YourEntity>() .Property(e => e.PersianContent) .HasColumnType("varchar(255) CHARACTER SET utf8mb4"); }
4. 检查MySQL Connector/NET版本
确保你使用的是最新版本的MySql.EntityFrameworkCore(或MySQL Connector/NET)包,旧版本对utf8mb4的支持可能存在缺陷。可以通过NuGet包管理器更新到最新稳定版。
验证方法
修改完成后重新插入波斯文数据,直接用MySQL Workbench或phpMyAdmin查看数据库记录——如果数据库中存储的是正确的波斯文而非问号,就说明问题已经解决。
内容的提问来源于stack exchange,提问作者Hamed.Bny




