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才行】。
Dapper操作MySQL数据库获取JSON数据中文乱码的更多相关文章
- .NET Core Dapper操作mysql数据库
前言 现在ORM盛行,市面上已经出现了N款不同的ORM套餐了.今天,我们不谈EF,也不聊神马黑马,就说说 Dapper.如何在.NET Core中使用Dapper操作Mysql数据库呢,让我们跟随镜头 ...
- Spring MVC3返回JSON数据中文乱码问题解决(转)
Spring MVC3返回JSON数据中文乱码问题解决 查了下网上的一些资料,感觉比较复杂,这里,我这几使用两种很简单的办法解决了中文乱码问题. Spring版本:3.2.2.RELEASE Jack ...
- 解析Qt4.7.3编译MySql数据库驱动,存中文乱码、过滤转义字符问题
问题:使用QSqlDataBase类建立连接MySql数据库驱动加载失败 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available ...
- Http请求传json数据中文乱码问题
业务场景:调easyui的dialog打开一个弹窗,传参是用json封装的,而且有中文,然后在极速模式是正常的,在ie11测试发现中文出现乱码了 var params = JSON.stringify ...
- 使用Dapper操作Mysql数据库
首先我想说明一下:相比最原始的ADO.NET,一般都认为封装过一层的ORM性能上会有损耗,但其实在使用中你会发现,当你需要把数据库对象转化为实体模型时,很多所谓的DbHelper其实封装的很低效,反而 ...
- python操作MySQL数据库并将数据写入excel
#!/usr/bin/python# -*- coding:utf-8 -*-'''方法:通过pymsql模块连接mysql数据库,然后通过游标cursor查询SQL语句将结果存储在Excel文件中, ...
- PHP读取mssql,json数据中文乱码
PHP及网页使用UTF-8编码,数据库是sql server2008,使用默认编码(936,即GBK编码) 当读取数据库数据时,使用php自带的json_encode()返回到前端,结果中文不显示. ...
- 更改Mysql数据库中的数据出现乱码问题
数据库服务器环境:windows 7 专业版 Mysql版本:5.5.36 出现问题:搭完工程之后,在做保存和插入操作时,涉及的数据在数据库中为变为乱码. 解决方案: MySQL数据库 ...
- json_encode处理json数据中文乱码
今天使用json_encode 把一个数组转换成json数据,echo处理的时候,显示为null.去查了php手册. 该函数只能接受 UTF-8 编码的数据. 在网上搜了下,找到了解决方法. < ...
随机推荐
- js join()
在本例中,我们将创建一个数组,然后把它的所有元素放入一个字符串: <script type="text/javascript"> var arr = new Array ...
- 为什么 generator 忽略第一次 next 调用的参数值呢?
首先要理解几个基本概念. 执行生成器不会执行生成器函数体的代码,只是获得一个遍历器 一旦调用 next,函数体就开始执行,一旦遇到 yield 就返回执行结果,暂停执行 第二次 next 的参数会作为 ...
- DIY电压基准测万用表
| 分类 日志 | 手里有三个常用的手持表,UT61E四位半,优利德明星产品:福禄克F117C,换挡快,单手操作还带LoZ:UT210E小钳表能够通过修改EEPROM更改电表配置,已经刷了6000字 ...
- JAVA WEB基础巩固之Json、Ajax
一.Json(Json介绍)json校验工具 Json是JavaScript object notation的缩写,优点是易读易编写易于解析: 例如:Object: { "name" ...
- 【原创】从零开始搭建Electron+Vue+Webpack项目框架(六)Electron打包,同时构建客户端和web端
导航: (一)Electron跑起来(二)从零搭建Vue全家桶+webpack项目框架(三)Electron+Vue+Webpack,联合调试整个项目(四)Electron配置润色(五)预加载及自动更 ...
- python基础-流程控制语句
所谓流程控制,就是在程序里面设定一些条件判断语句,满足哪条,就执行哪条 #if 单分支 if 条件: 满足条件后执行的代码 #例子 > : print()#结果为666 双分支 if 条件: 满 ...
- Java2变量和运算符
课后作业:[必做题] 1√AB互换 已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序.(知识点:变量和运算符综合应用) [必做题] package com.two; public clas ...
- datatable某列不排序、和自定义搜索、给数据里面加属性
datatable中如果不想对前几列进行排序,使用以下代码: $('#informationList').DataTable({ //对0,1,2列不排序 "columnDefs" ...
- springmvc两种配置方法
基于配置文件xml方式, 配置springmvc步骤: 1.在pom文件中引入jar包: <!--导入springmvc的jar包--> <dependency> <gr ...
- iOS开发线程同步技术-锁
概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...