在項目中利用Dapper將JSON數據存儲到MySQL數據庫,結果發現JSON數據中的中文亂碼,特此記錄,但願對存儲JSON的童鞋能有所幫助,文中如有錯誤之處,還望批評指正。數據庫
爲了引出最終問題出在什麼地方,咱們重頭開始進行講解,首先咱們給出以下測試實體以及在數據庫中的表,以下: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才行】。接口