1. 程式人生 > >MySQL與JSON

MySQL與JSON

JSON簡介

百度百科走一發:JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。類似XML,但比XML更小、更快,更易解析。

JSON語法規則

  • 資料表示為鍵值對
  • 資料由逗號分隔
  • 花括號儲存物件
  • 方括號儲存陣列

一個典型的JSON長這樣:

{
"sites": [
{ "name":"我的部落格" , "url":"https://blog.csdn.net/zhchs2012" }, 
{ "name":"百度" , "url":"www.baidu.com" }, 
{ "name":"微博"
, "url":"www.weibo.com" } ]
}

MySQL對JSON的支援

MySQL5.7.8開始,MySQL提供了一個原生的Json型別,在此之前JSON是以字串的形式儲存的。
新型別的優勢:

  1. JSON資料型別,會自動校驗資料是否為JSON格式,如果不是JSON格式資料,則會報錯;
  2. MySQL提供了一組操作JSON資料的內建函式(重點!!!);
  3. 優化的儲存格式,儲存在JSON列中的JSON資料被轉換成內部的儲存格式。允許快速讀取;
  4. 可以修改特定的鍵值,而不需要更新整個JSON內容。

MySQL對JSON的操作

作為一個數據分析人員,對JSON的查詢操作是最為關心的,其他諸如建立相關的瞭解一下就好,大不了用時再查嘛。據我所知實際工作中很多程式設計師也是這樣工作的,斜眼笑-。-

1、JSON_TYPE()

用於得知JSON字串的型別。

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"'
) | +----------------------+ | STRING | +----------------------+ mysql> SELECT JSON_TYPE('hello'); ERROR 3146 (22032): Invalid data type for JSON data in argument 1 to function json_type; a JSON string or JSON type is required.

2、JSON_OBJECT()

用於構造一個JSON型別。

mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"}            |
+---------------------------------------+

3、JSON_VALID()

檢查是否是正確的JSON類。

mysql> SELECT JSON_VALID('null'), JSON_VALID('Null'), JSON_VALID('NULL');
+--------------------+--------------------+--------------------+
| JSON_VALID('null') | JSON_VALID('Null') | JSON_VALID('NULL') |
+--------------------+--------------------+--------------------+
|                  1 |                  0 |                  0 |
+--------------------+--------------------+--------------------+

4、JSON_MERGE()

用於合併兩個JSON。

mysql> SELECT JSON_MERGE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}');
+----------------------------------------------------+
| JSON_MERGE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}') |
+----------------------------------------------------+
| {"a": [1, 4], "b": 2, "c": 3}                      |
+----------------------------------------------------+

5、JSON_EXTRACT()

JSON提取函式,我們最關心最常使用的函式。

mysql> SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');
+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan"                                               |
+---------------------------------------------------------+

5.1、->操作符

用處跟JSON_EXTRACT()是一樣的,另一種寫法。

SELECT req_info -> "$.bankcard_no" FROM t_trade_record;

等同於

SELECT JSON_EXTRACT(req_info, "$.bankcard_no") FROM t_trade_record;

6、JSON_KEYS()

JSON_KEYS(json_doc, [path]) 以列表返回頂層所有key,或者path路徑下的所有頂層key

7、JSON_SEARCH()

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])查詢函式,返回search_str所在的位置,支援萬用字元%,類似於like語句。第二個引數one是查詢一個,all是查詢所有,如果有多個匹配結果則以列表返回,否則與one的結果一致。

8、 JSON_CONTAINS()

JSON_CONTAINS(target, candidate[, path])也是一個查詢函式,確認candidate是否在JSON中存在。存在返回1,不存在返回0.

結束語

關於MySQL一些內建JSON函式就介紹到這,當然MySQL提供的函式還不止這些。新版本引進的原生對JSON的支援相比以前真的方便了不少。不過對於MySQL本人還有另外一個遺憾,就是一直都不支援開窗函式,真是令人苦惱。不過聽說在更新的8.0版本已經新增,找機會去體驗一哈。

更詳細的關於MySQL對JSON的支援可以查閱官方文件:
https://dev.mysql.com/doc/refman/5.7/en/json-functions.html
https://dev.mysql.com/doc/refman/8.0/en/json-functions.html