隨着NOSQL數據庫的廣泛應用,可擴展的存儲方式在關系型數據庫中也有了很好的支持,MySQL5.7中就新增加了一個數據類型:JSON
JSON數據類型意義
其實,沒有JSON數據類型的支持,我們一樣可以通過varchar類型或者text等類型來保存這一格式的數據,但是,為什么還要專門增加這一數據格式的支持呢?其中肯定有較varchar或者text來存儲此類型更優越的地方。
- 保證了JSON數據類型的強校驗,JSON數據列會自動校驗存入此列的內容是否符合JSON格式,非正常格式則報錯,而varchar類型和text等類型本身是不存在這種機制的。
- MySQL同時提供了一組操作JSON類型數據的內置函數。
- 更優化的存儲格式,存儲在JSON列中的JSON數據會被轉成內部特定的存儲格式,允許快速讀取。
- 可以基於JSON格式的特征支持修改特定的鍵值。(即不需要把整條內容拿出來放到程序中遍歷然后尋找替換再塞回去,MySQL內置的函數允許你通過一條SQL語句就能搞定)
1、新增JSON類型
CREATE TABLE `user_copy` ( `id` int(11) NOT NULL, `name` varchar(20) DEFAULT NULL, `lastlogininfo` json DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; SET FOREIGN_KEY_CHECKS=1;
2、創建JSON值
mysql> INSERT INTO t_json VALUES(JSON_ARRAY('json_array')); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO t_json VALUES(JSON_OBJECT('key','hello')); Query OK, 1 row affected (0.09 sec) mysql> INSERT INTO t_json VALUES(JSON_MERGE_PRESERVE(JSON_OBJECT('key','hello'),JSON_ARRAY(1,2))); Query OK, 1 row affected (0.14 sec) mysql> SELECT * FROM t_json; +--------------------------------------+ | jdoc | +--------------------------------------+ | [1, 2] | | {"key1": "value1", "key2": "value2"} | | "HELLO" | | ["json_array"] | | {"key": "hello"} | | [{"key": "hello"}, 1, 2] | +--------------------------------------+ 6 rows in set (0.00 sec)
3、搜索和修改JSON值
路徑語法
.keyName
:JSON對象中鍵名為keyName
的值;- 對於不合法的鍵名(如有空格),在路徑引用中必須用雙引號
"
將鍵名括起來,例."key name"
; [index]
:JSON數組中索引為index的值,JSON數組的索引同樣從0開始;[index1 to index2]
:JSON數組中從index1
到index2
的值的集合;.*
: JSON對象中的所有value
;[*]
: JSON數組中的所有值;prefix**suffix
: 以prefix
開頭並以suffix
結尾的路徑;**.keyName
為多個路徑,如對於JSON對象'{"a": {"b": 1}, "c": {"b": 2}}'
,'$**.b'
指路徑$.a.b
和$.c.b
;- 不存在的路徑返回結果為NULL;
- 前導$字符表示當前正在使用的JSON文檔;
- 例子:對於數組
[3, {"a": [5, 6], "b": 10}, [99, 100]]
$[1]
為{"a": [5, 6], "b": 10}
;[1].a
為[5, 6]
;$[1].a[1]
為6
;$[1].b
為10
;$[2][0]
為99
。
3.1 搜索
- JSON對象
mysql> SELECT JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.name'); +--------------------------------------------------------+ | JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.name') | +--------------------------------------------------------+ | "Taylor" | +--------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.*'); +-----------------------------------------------------+ | JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.*') | +-----------------------------------------------------+ | [29, "Taylor"] | +-----------------------------------------------------+ 1 row in set (0.00 sec)
- JSON數組
mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[1]'); +-----------------------------------------+ | JSON_EXTRACT('["a", "b", "c"]', '$[1]') | +-----------------------------------------+ | "b" | +-----------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[1 to 2]'); +----------------------------------------------+ | JSON_EXTRACT('["a", "b", "c"]', '$[1 to 2]') | +----------------------------------------------+ | ["b", "c"] | +----------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[*]'); +-----------------------------------------+ | JSON_EXTRACT('["a", "b", "c"]', '$[*]') | +-----------------------------------------+ | ["a", "b", "c"] | +-----------------------------------------+ 1 row in set (0.00 sec)
3.2 修改
JSON_REPLACE
和JSON_SET
的區別// 舊值存在 mysql> SELECT JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.name', 'Mere'); +----------------------------------------------------------------+ | JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.name', 'Mere') | +----------------------------------------------------------------+ | {"id": 29, "name": "Mere"} | +----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_SET('{"id": 29, "name": "Taylor"}', '$.name', "Mere"); +------------------------------------------------------------+ | JSON_SET('{"id": 29, "name": "Taylor"}', '$.name', 'Mere') | +------------------------------------------------------------+ | {"id": 29, "name": "Mere"} | +------------------------------------------------------------+ 1 row in set (0.00 sec) // 舊值不存在 mysql> SELECT JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere'); +---------------------------------------------------------------+ | JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere') | +---------------------------------------------------------------+ | {"id": 29, "name": "Taylor"} | +---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_SET('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere'); +-----------------------------------------------------------+ | JSON_SET('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere') | +-----------------------------------------------------------+ | {"id": 29, "cat": "Mere", "name": "Taylor"} | +-----------------------------------------------------------+ 1 row in set (0.00 sec)
JSON_INSERT
與JSON_SET
的區別// 舊值存在 mysql> SELECT JSON_INSERT('[1, 2, 3]', '$[1]', 4); +-------------------------------------+ | JSON_INSERT('[1, 2, 3]', '$[1]', 4) | +-------------------------------------+ | [1, 2, 3] | +-------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_SET('[1, 2, 3]', '$[1]', 4); +----------------------------------+ | JSON_SET('[1, 2, 3]', '$[1]', 4) | +----------------------------------+ | [1, 4, 3] | +----------------------------------+ 1 row in set (0.00 sec) //舊值不存在 mysql> SELECT JSON_INSERT('[1, 2, 3]', '$[4]', 4); +-------------------------------------+ | JSON_INSERT('[1, 2, 3]', '$[4]', 4) | +-------------------------------------+ | [1, 2, 3, 4] | +-------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT JSON_SET('[1, 2, 3]', '$[4]', 4); +----------------------------------+ | JSON_SET('[1, 2, 3]', '$[4]', 4) | +----------------------------------+ | [1, 2, 3, 4] | +----------------------------------+ 1 row in set (0.00 sec)