You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动