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
);
這樣就創建了一個訂單表featur
為JSON
類型
注意
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文件中的注釋部分
用圖表表示如下圖