【微服務架構】-【MySQL數據類型】-MySQL5.7新特性(對 JSON數據類型 支持)

JSON是數據傳輸與存儲  數據格式,在微服務中大量使用,重點翻譯下MySQL官方對JSON的支持,方便後期業務JSON數據處理工作。

JSON數據類型

從MySQL 5.7.8開始,MySQL支持RFC 7159JSON 定義的本機數據類型 ,可以高效訪問JSON(JavaScript Object Notation)文檔中的數據。與在字符串列中存儲JSON格式字符串相比,數據類型具有以下優勢: JSON

  • 存儲在JSON列中的JSON文檔的自動驗證 。無效的文檔會產生錯誤。

  • 優化的存儲格式。存儲在JSON列中的JSON文檔將 轉換爲內部格式,以允許對文檔元素進行快速讀取訪問。當服務器稍後必須讀取以該二進制格式存儲的JSON值時,不需要從文本表示中解析該值。二進制格式的結構使服務器能夠直接通過鍵或數組索引查找子對象或嵌套值,而無需在文檔之前或之後讀取所有值。

注意

此討論使用JSONmonotype來指定JSON數據類型和 常規字體中的“ JSON ”以指示一般的JSON數據。

存儲JSON文檔所需的空間與LONGBLOB或 大致相同LONGTEXT; 有關更多信息請參見 第11.8節“數據類型存儲要求”。請務必記住,JSON列中存儲的任何JSON文檔的大小都限制爲max_allowed_packet系統變量的值。(當服務器在內存中內部操作JSON值時,它可能大於此值;當服務器存儲時,該限制適用。)

JSON列不能有非NULL默認值。

除了JSON數據類型之外,還有一組SQL函數可用於對JSON值進行操作,例如創建,操作和搜索。以下討論顯示了這些操作的示例。有關各個函數的詳細信息,請參見第12.17節“JSON函數”

還提供了一組用於操作GeoJSON值的空間函數。請參見第12.16.11節“空間GeoJSON函數”

JSON列,如其他二進制類型的列,不直接索引; 相反,您可以在生成的列上創建索引,該列從列中提取標量值 JSON。有關詳細示例,請參閱 索引生成的列以提供JSON列索引

MySQL優化器還在與JSON表達式匹配的虛擬列上查找兼容索引。

MySQL NDB Cluster 7.5(7.5.2及更高版本)支持 JSON列和MySQL JSON函數,包括在列生成的JSON列上創建索引 ,作爲無法索引JSON列的變通方法。JSON每個NDB表最多支持3列 。

接下來的幾節提供了有關JSON值的創建和操作的基本信息。

創建JSON值

JSON數組包含一個由逗號分隔的值列表,幷包含在 字符[]字符中:

JSON對象包含一組由逗號分隔的鍵值對,幷包含在字符{ }字符中:

如示例所示,JSON數組和對象可以包含字符串或數字的標量值,JSON空文字或JSON布爾值true或false文字。JSON對象中的鍵必須是字符串。時間(日期,時間或日期時間)標量值也是允許的:

在JSON數組元素和JSON對象鍵值中允許嵌套:

您還可以爲此目的從MySQL提供的許多函數中獲取JSON值 以及JSON使用其他類型的值轉換爲類型 。接下來的幾段描述了MySQL如何處理作爲輸入提供的JSON值。

在MySQL中,JSON值被寫爲字符串。MySQL解析JSON值的上下文中使用的任何字符串,如果它作爲JSON無效則會產生錯誤。這些上下文包括將值插入到具有JSON數據類型的列中, 並將參數傳遞給期望JSON值的函數(通常顯示爲 json_doc或 json_val在MySQL JSON函數的文檔中),如以下示例所示:

JSON 如果值是有效的JSON值,則 嘗試將值插入列成功,但如果不是,則嘗試失敗:    

 

JSON_TYPE()函數需要一個JSON參數並嘗試將其解析爲JSON值。如果值有效,則返回值的JSON類型,否則產生錯誤:   

MySQL使用utf8mb4字符集和utf8mb4_bin排序規則處理JSON上下文中使用的 字符串 。其他字符集中的字符串將utf8mb4根據需要進行轉換。(對於在串ascii或 utf8字符集,則不需要轉換,因爲asciiutf8都是的子集utf8mb4。)

作爲使用文字字符串編寫JSON值的替代方法,存在用於從組件元素組成JSON值的函數。JSON_ARRAY()獲取(可能爲空)值列表並返回包含這些值的JSON數組:

JSON_OBJECT() 獲取(可能爲空)鍵值對列表並返回包含這些對的JSON對象:

JSON_MERGE() 獲取兩個或多個JSON文檔並返回組合結果:

有關合並規則的信息,請參閱 JSON值的規範化,合併和自動包裝

可以將JSON值分配給用戶定義的變量:

但是,用戶定義的變量不能是 JSON數據類型,所以雖然 @j在前面的例子中看起來像一個JSON值並且具有相同的字符集和歸類爲JSON值,但它具有 JSON數據類型。相反,結果from JSON_OBJECT()在分配給變量時會轉換爲字符串。

通過轉換JSON值生成的字符串具有以下字符集utf8mb4和排序規則 utf8mb4_bin


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章