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是以字串的形式儲存的。
新型別的優勢:
- JSON資料型別,會自動校驗資料是否為JSON格式,如果不是JSON格式資料,則會報錯;
- MySQL提供了一組操作JSON資料的內建函式(重點!!!);
- 優化的儲存格式,儲存在JSON列中的JSON資料被轉換成內部的儲存格式。允許快速讀取;
- 可以修改特定的鍵值,而不需要更新整個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