MySQL支持RFC 7159JSON定義的本機(jī)數(shù)據(jù)類型叨粘,可以高效訪問JSON文檔中的數(shù)據(jù)猾编。相比于在字符串中存儲的json格式字符串瘤睹,JSON文檔數(shù)據(jù)類型有以下好處:
- 存儲在JSON類中的JSON文檔能夠自動(dòng)驗(yàn)證,無效的文檔會報(bào)錯(cuò)
- 存儲在JSON列中的JSON文檔會轉(zhuǎn)化為內(nèi)部格式答倡,這樣可以對文檔進(jìn)行快速訪問轰传。不需要重新從文本中解析json值,能夠直接通過鍵或數(shù)組索引查找子對象或者嵌套值。
JSON操作
- 創(chuàng)建JSON:
JSON數(shù)組:
['a','sd',20,true,null]
JSON對象
{"key1": "value1","key2": 30}
JSON對象和數(shù)組可以包含字符串,數(shù)字類型识脆,空,布爾值恕曲。JSON對象中的鍵必須是字符串。
在JSON數(shù)組中可以允許有JSON數(shù)組或?qū)ο蟮那短撞秤浚纾?/p>
[10,{''id": 1,"name": "Micheal"},[null,false,"type"]]
{"id": 1,"value": [2,24]}
MySQL如何處理作為輸入的JSON值:
- 輸入的值為有效的JSON值時(shí)佩谣,值能成功插入,無效則報(bào)錯(cuò):
CREATE TABLE jsonDemo (jdoc JSON);
INSERT INTO jsonDemo VALUES ('{"key1": "Micheal"}');
INSERT INTO jsonDemo VALUES ('{1: "Micheal"}');
上面例子中前兩條成功執(zhí)行歼捏,最后一條結(jié)果:
INSERT INTO jsonDemo VALUES ('{1: "Micheal"}') Error Code: 3140. Invalid JSON text: "Missing a name for object member." at position 1 in value for column 'jsonDemo.jdoc'.
- JSON_TYPE()函數(shù):將一個(gè)JSON參數(shù)解析為JSON值,如果值有效笨篷,返回JSON類型瞳秽,否則產(chǎn)生錯(cuò)誤
SELECT JSON_TYPE('["a",1,true]');
SELECT JSON_TYPE('"HELLO"');
SELECT JSON_TYPE('hello');
第一條語句返回ARRAY
第二條語句返回STRING
第三條語句報(bào)錯(cuò):Error Code: 3141. Invalid JSON text in argument 1 to function json_type: "Invalid value." at position 0.
MySQL還提供了一系列創(chuàng)建JSON值的替代方法比如:
JSON_ARRAY()
JSON_OBJECT()
JSON_MERGE_PRESERVE()
關(guān)于這三個(gè)方法的用法可以自行搜索獲得。
搜索和修改JSON值
- 通過JSON路徑表達(dá)式選擇JSON文檔中的值
例如:從下面json文檔中查詢鍵為name的值:
SELECT JSON_EXTRACT('{"id": 1,"name": "Micheal"}','$.name');
查詢結(jié)果:
"Micheal"
JSON路徑表達(dá)式語法:
使用$ 字符表示當(dāng)前JSON文檔率翅,$后可跟選擇器
選擇器:
- .加key的名稱练俐,比如'$.name'
- [N] N: 數(shù)組的下標(biāo)
- [M to N] 數(shù)組下標(biāo)范圍
路徑還可包含通配符 或*: - .[*]查詢json對象中所有成員的值
- [*] 查詢json數(shù)組中所有成員的值
- prefix*suffix 查詢所有以命名前綴開頭并以命名后綴結(jié)尾的路徑
其中文檔中不存在的路徑的結(jié)果為NULL。
舉例:
SELECT JSON_EXTRACT('{"id": 1,"name": "Micheal"}','$.id');
SELECT JSON_EXTRACT('[1,22,4,12]','$[2]');
SELECT JSON_EXTRACT('[1,22,4,12]','$[0 to 2]');
SELECT JSON_EXTRACT('[1,22,4,12]','$[*]');
SELECT JSON_EXTRACT('{"id": 1,"name": "Micheal"}','$.*');
結(jié)果分別為:
1冕臭,4腺晾,[1, 22, 4],[1, 22, 4, 12],[1, "Micheal"]