MySQL JSON 數據類型


MySQL JSON 數據類型

從 MySQL 5.7.8 開始,MySQL 支持由RFC 7159定義的本機JSON數據類型

在沒有JSON格式之前在創建時可能會使用BLOB或者TEXT或者VARCHAR來存儲,在項目中使用反序列化的方式轉換為對應的對象

在有JSON后該類型可有效訪問 JSON文檔中的數據。與將 JSON 格式的字符串存儲在字符串列中相比,JSON數據類型具有以下優點:

  • 自動驗證存儲在JSON列中的 JSON 文檔。無效的文檔會產生錯誤。
  • 優化的存儲格式。存儲在JSON列中的 JSON 文檔將轉換為內部格式,從而可以快速讀取文檔元素。當服務器稍后必須讀取以該二進制格式存儲的 JSON 值時,則無需從文本 table 示形式解析該值。二進制格式的結構使服務器可以直接通過鍵或數組索引查找子對象或嵌套值,而無需讀取文檔中它們之前或之后的所有值。

先簡單創建一個表

CREATE TABLE `order` (
	id INT(11) PRIMARY KEY,
	feature JSON
);	

這樣就創建了一個訂單表featurJSON類型

注意

  • JSON列不能具有非NULL的默認值
  • 存儲JSON文檔所需的空間與LONGBLOB或LONGTEXT大致相同
  • 存儲在JSON列中的任何 JSON 文檔的大小都限於max_allowed_packet系統變量的值

至於為什么會有以上的限制下面會解釋

JSON操作函數

點擊Name可以跳轉到對應的使用方法

Name Description Introduced Deprecated
-> JSON 列返回值;相當於 JSON_EXTRACT()。
->> 評估路徑並取消引用結果后從 JSON 列返回值;相當於 JSON_UNQUOTE(JSON_EXTRACT()) 5.7.13
JSON_APPEND() 將數據附加到 JSON 文檔 Yes
JSON_ARRAY() 創建 JSON 數組
JSON_ARRAY_APPEND() 將數據添加到 JSON數組
JSON_ARRAY_INSERT() 插入 JSON 數組
JSON_CONTAINS() JSON 文檔是否在路徑中包含特定對象
JSON_CONTAINS_PATH() JSON 文檔是否在路徑中包含任何數據
JSON_DEPTH() JSON 文檔的最大深度
JSON_EXTRACT() 從 JSON 文檔返回數據
JSON_INSERT() 將數據插入 JSON 文檔
JSON_KEYS() JSON 文檔中的鍵數組
JSON_LENGTH() JSON 文檔中的元素數
JSON_MERGE() 合並 JSON 文檔,保留重復的鍵。 JSON_MERGE_PRESERVE()的已棄用同義詞 5.7.22
JSON_MERGE_PATCH() 合並 JSON 文檔,替換重復鍵的值 5.7.22
JSON_MERGE_PRESERVE() 合並 JSON 文檔,保留重復的鍵 5.7.22
JSON_OBJECT() 創建 JSON 對象
JSON_PRETTY() 以易於閱讀的格式打印 JSON 文檔 5.7.22
JSON_QUOTE() 引用 JSON 文檔
JSON_REMOVE() 從 JSON 文檔中刪除數據
JSON_REPLACE() 替換 JSON 文檔中的值
JSON_SEARCH() JSON 文檔中值的路徑
JSON_SET() 將數據插入 JSON 文檔
JSON_STORAGE_SIZE() 用於存儲 JSON 文檔的二進制 table 示形式的空間 5.7.22
JSON_TYPE() JSON 值類型
JSON_UNQUOTE() 取消引用 JSON 值
JSON_VALID() JSON 值是否有效

注意

  • 當不是JSON列時也可以使用上面的函數
  • 當使用上面函數對JSON文檔修改時MySQL還會在原始 JSON 文檔中的鍵,值或元素之間舍棄多余的空格,並在顯示時在每個逗號(,)或冒號(:)后留一個空格(或在必要時插入)。這樣做是為了提高可讀性。
  • 為了使查找更有效率,它還會對 JSON 對象的鍵進行排序。 您應注意,此排序的結果可能會更改,並且不能保證在各個發行版中都保持一致

JSON在MySQL中是如何存儲的

JSON數據在存儲時和我們以前的存儲沒什么區別也是使用BLOB,MySQL支持JSON做法是在server層提供了便於操作JSON的函數,在存儲還是把JSON編碼為BLOB,然后交給存儲引擎層,所以InnoDB和MyISAM都可以支持JSON列,這也解釋了文章開頭所說的注意事項

至於怎么轉換為BLOB存儲可以看json_binary.h文件中的注釋部分

用圖表表示如下圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM