zoukankan      html  css  js  c++  java
  • Dapper操作MySQL数据库获取JSON数据中文乱码

    前言

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

    Dapper获取JSON数据乱码(MySQL)

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

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

    为了数据操作方便,我们通过包【Dapper.SimpleCRUD】来操作,插入数据和查询数据如下:

    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编码,再查询时进行解码即可,如下:

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

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

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

    总结

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

  • 相关阅读:
    如何在服务器上添加本地驱动器
    JQ查找到带有某个字符,并起类名,然后替换这个某个字符
    使用IWMS的网站打开显示“未能加载文件或程序集”,解决方案
    表头固顶结构
    在页面中有overflow-y:auto属性的div,当出现滚动条,点击返回顶部按钮,内容回这个div最顶部
    在文档页面整个区域出现导航随内容滚动高亮显示效果
    在文档页面局部出现导航随内容滚动高亮显示效果
    在Hmtl页面中只让其中单独的一个div隐藏滚动条但是仍可滚动浏览下边的内容
    GC参考手册 —— GC 调优(工具篇)
    GC参考手册 —— GC 算法(实现篇)
  • 原文地址:https://www.cnblogs.com/CreateMyself/p/12574943.html
Copyright © 2011-2022 走看看