Dapper操做MySQL数据库获取JSON数据中文乱码

前言

在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,但愿对存储JSON的童鞋能有所帮助,文中如有错误之处,还望批评指正。数据库

Dapper获取JSON数据乱码(MySQL)

为了引出最终问题出在什么地方,咱们重头开始进行讲解,首先咱们给出以下测试实体以及在数据库中的表,以下:json

    public class Test
    {
        public int Id { get; set; }
        public string Data { get; set; }
    }

为了数据操做方便,咱们经过包【Dapper.SimpleCRUD】来操做,插入数据和查询数据以下:app

static void Main(string[] args)
{
    SimpleCRUD.SetDialect(SimpleCRUD.Dialect.MySQL);
    DefaultTypeMap.MatchNamesWithUnderscores = true;

    using (var conn = new MySqlConnection(@".....;charset=utf8mb4;SslMode=none;"))

    {
        var id = conn.Insert(new Test()
        {
            Data = JsonConvert.SerializeObject(new
            {
                name = "汪鹏"
            })
         });

        var result = conn.Get<Test>(id);
    }

    Console.ReadKey();
}

如上一切正常,接下来咱们将存储JSON数据的列类型修改成json,而后再来进行如上操做,结果会发现获取数据中文将乱码:测试

 

刚开始我猜测难道用的包【Dapper.SimpleCRUD】在映射时出了问题,因而我用Dapper进行以下查询,依然会出现如上中文乱码:编码

var result = conn.QueryFirstOrDefault<Test>("select * from Test where Id = @id", new { id });

 因此由上基本能够得出结论:针对MySQL中的类型json,若json数据中存在中文,则利用Dapper查询时将出现乱码。那么如何解决这个问题呢?因而乎,在添加数据时,我将中文进行URL编码,再查询时进行解码便可,以下:spa

var id = conn.Insert(new Test()
{
    Data = JsonConvert.SerializeObject(new
    {
        name = HttpUtility.UrlEncode("汪鹏")
    })
 });

固然,上述解决方案以实际项目业务而去解决,咱们项目须要获取到JSON数据中的中文而后经过URL传输,免去请求接口再去获取所存储的名称。到此咱们了解了Dapper针对json数据类型将致使查询中文乱码的问题,可是其根本缘由是什么呢?上述链接MySQL的驱动,是使用Oracle官方所提供的驱动且为最新版本,以下:code

咱们知道经过EF Core操做MySQL数据库,如果利用官方包有一堆问题存在,因此大多都是采用的包【Pomelo.EntityFrameworkCore.MySql】,由于里面包含【MySqlConnector】,换句话说也就存在MySQL的驱动链接,因此这里咱们尝试利用该包替换上述【MySql.Data】包,结果发现中文再也不乱码。blog

总结

综上所述,咱们须要注意的是若利用官方驱动包【MySql.Data】,当配置MySQL中的列类型为json时,若json数据中存在中文,则利用Dapper查询时将会出现中文乱码,须要进行转换,上述在数据库链接字符串中咱们设置为utf8mb4,因此理论上应该和编码没有任何关系,【最新更新:与Dapper无关,utf8将致使乱码,须要将表编码配置为utf8mb4才行】。接口

相关文章
相关标签/搜索