MySQL 5.7之JSON特性
Mysql 5.7之後開始支援Json格式的原生欄位型別,現將json新特性作如下整理,僅供參考。
JSON函式的完整列表:
Mysql官方給出的json相關的函式,完整列表如下:
分類 |
函式 |
描述 |
示例 |
結果展示 |
建立JSON |
JSON_ARRAY |
建立JSON陣列 |
JSON_ARRAY(1,2) |
[1, 2] |
JSON_OBJECT |
建立JSON物件 |
JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','這是第一條測試objcet的記錄') |
{"id": 1541560547, "remark": "這是第一條測試objcet的記錄"} |
|
JSON_QUOTE |
將json轉成json字串型別 |
JSON_QUOTE('[1,2]') |
"[1,2]" |
|
查詢JSON |
JSON_CONTAINS |
判斷是否包含某個JSON值 |
JSON_CONTAINS(`json_arr_test`,'[1]') |
|
JSON_CONTAINS_PATH |
判斷某個路徑下是否包含json值 |
JSON_CONTAINS_PATH(`json_obj_test`,'one','$.remark','$.b') |
見下 |
|
JSON_EXTRACT |
提取JSON值 |
JSON_EXTRACT(`json_arr_test`,'$[1]') || `json_obj_test`->'$.id' |
2 其中,如果引數為'$',則返回整個json陣列 |
|
json_extract的簡潔寫法, |
`json_obj_test`->'$.id',MySQL 5.7.9開始支援 |
|||
JSON_KEYS |
提取json中的鍵值為json陣列 |
JSON_KEYS(`json_obj_test`) |
["id","remark"] |
|
JSON_SEARCH |
按給定字串關鍵字搜尋json,返回匹配的路徑 |
JSON_SEARCH(`json_arr_test`,「'one'|'all'」,'01278923') |
"$[2].code" |
|
修改JSON |
JSON_APPEND |
廢棄,MySQL 5.7.9開始改名為json_array_append |
||
JSON_ARRAY_APPEND |
末尾新增陣列元素,如果原有值是數值或json物件,則轉成陣列後,再新增元素 |
JSON_ARRAY_APPEND(`json_arr_test`,'$',JSON_OBJECT('code','01278923','name','Wyao')) 注意:插入之前要確保欄位不為null,否則插入不成功。 |
[1,2,{"code":"01278923","name":"Wyao"}] |
|
JSON_ARRAY_INSERT |
向指定位置插入陣列元素 |
JSON_ARRAY_INSERT(`json_arr_test`,'$[2]',JSON_OBJECT('course_code','02','course','Math')) |
[3,4,{"course":"Math","course_code":"02"}] |
|
JSON_INSERT |
插入值(如果不存在則插入新值,如果存在則不作操作。) |
JSON_INSERT(`json_obj_test`,'$.id',012923,'$.status',1) 因為id值已存在,所以無法插入新值。 |
{"id":1541560547,"remark":"這是第一條測試objcet的記錄","status":1} |
|
JSON_MERGE |
合併JSON陣列或者物件 |
JSON_MERGE_PRESERVE(`json_arr_test`->'$[0]',`json_arr_test`->'$[1]') |
||
JSON_REMOVE |
刪除JSON資料 |
JSON_REMOVE(`json_arr_test`,'$[0]') |
||
JSON_REPLACE |
替換值(只對存在的key有效。) |
JSON_REPLACE(`json_arr_test`,'$[0]','[true, false]') |
[4] => ["[true,false]"] |
|
JSON_SET |
設定值,如果存在,則覆蓋值;如果不存在,則新增值。 |
JSON_SET(`json_arr_test`,'$[0]','Wyao','$[1]','[true,false]') |
["[true,false]"] => ["Wyao","[true,false]"] |
|
JSON_UNQUOTE |
去除JSON字串的引號,將值轉換成string型別。(去掉引用(引號),返回一個utf8mb4格式的字串) |
JSON_UNQUOTE(`json_arr_test`) |
||
JSON屬性 |
JSON_DEPTH |
返回JSON文件的最大深度 |
JSON_DEPTH(json_obj_test) 【key的深度】 |
|
JSON_LENGTH |
返回JSON文件的最大長度 |
JSON_LENGTH(json_obj_test) 【key的長度】 |
||
JSON_TYPE |
返回JSON值的型別 |
JSON_TYPE(json_arr_test) |
||
JSON_VALID |
判斷是否為合法JSON文件 |
JSON_VALID(json_arr_test) |
Returns 0 or 1 to indicate whether a value is valid JSON. Returns NULL if the argument is NULL. |
註釋:
- JSON_CONTAINS_PATH:【JSON_CONTAINS_PATH(`json_obj_test`,「'one'|'all'」,'$.remark','$.b')】
- 'one': 1 if at least one path exists within the document, 0 otherwise.(至少有一個在此json(`json_obj_test`)段中,沒有返回0)
-
-
- SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'one','$.remark','$.b');
-
- SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'one','$.remark','$.b');
- 'all': 1 if all paths exist within the document, 0 otherwise.(變數全部在此JSON(`json_obj_test`)段中,否則查詢為0)
- SELECT `operator`,`json_arr_test`FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'all','$.remark','$.b');
-
- SELECT `operator`,`json_arr_test`FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'all','$.remark','$.b');
-
- JSON_EXTRACT:【JSON_EXTRACT(`json_obj_test`,'$.id') <=> `json_obj_test`->'$.id'】In MySQL 5.7.9 and later
- SELECT `id`, `operator`, JSON_EXTRACT(`json_obj_test`,'$.id') FROM lnmp ORDER BY `json_obj_test`->'$.id';
- SELECT `id`, `operator`, `json_obj_test`->'$.id' FROM lnmp ORDER BY `json_obj_test`->'$.id';
-
-
-
UPDATE lnmp SET `name`="Wyaooo" WHERE `json_obj_test`->'$.id' = 1541560547;
嚴格控制變數的資料型別,string型別一定要加引號
-
-
-
- JSON_SEARCH:【】
- 'one': The search terminates after the first match and returns one path string. It is undefined which match is considered first.(返回匹配到的第一個元素的位置)
- 'all': The search returns all matching path strings such that no duplicate paths are included. If there are multiple strings, they are autowrapped as an array. The order of the array elements is undefined.(返回匹配到的所有的元素的位置)
JSON_INSERT、JSON_REPLACE、JSON_SET三者的比較:
(1)JSON_SET()替換現有值,並新增新的值;
(2)JSON_INSERT()新增新值,但是並不會替換已經存在的值;
(3)JSON_REPLACE()只用來替換已經存在的值,否則不做操作。
相關示例SQL語句如下:
DROP TABLE IF EXISTS `lnmp` ;
CREATE TABLE `lnmp` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`operator` VARCHAR(8) NOT NULL DEFAULT '',
`json_arr_test` JSON ,
`json_obj_test` JSON ,
PRIMARY KEY (`id`)
);
DESC `lnmp`;
SELECT * FROM lnmp;
INSERT INTO `lnmp` (`operator`, `json_arr_test`, `json_obj_test`) VALUES ('Mr.Wang',JSON_ARRAY(1,2),JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','這是第一條測試objcet的記錄'));
INSERT INTO `lnmp` (`operator`, `json_arr_test`, `json_obj_test`) VALUES ('Mr.Zhang',JSON_ARRAY(3,4),JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','大江東去浪淘盡'));
SELECT JSON_QUOTE('[1,2]');
SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS(`json_obj_test`,'["這是第一條測試objcet的記錄"]','$.remark');
SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'all','$.remark','$.b');
SELECT `id`, `operator`, JSON_EXTRACT(`json_obj_test`,'$.id') FROM lnmp ORDER BY `json_obj_test`->'$.id';
SELECT `id`, `operator`, `json_obj_test`->'$.id' FROM lnmp ORDER BY `json_obj_test`->'$.id';
ALTER TABLE `lnmp` ADD COLUMN `name` VARCHAR(8) DEFAULT '' COMMENT '操作人姓名' AFTER `operator`;
UPDATE lnmp SET `name`='wyaooo' WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_arr_test`=JSON_ARRAY_APPEND(`json_arr_test`,'$',JSON_OBJECT('code','01278923','name','Wyao')) WHERE `json_obj_test`->'$.id' = 1541560547;
SELECT JSON_KEYS(`json_obj_test`) FROM `lnmp` WHERE `json_obj_test`->'$.id' = 1541560547;
SELECT JSON_SEARCH(`json_arr_test`,'one','01278923') FROM lnmp;
UPDATE lnmp SET `json_arr_test` = JSON_ARRAY_INSERT(`json_arr_test`,'$[2]',JSON_OBJECT('course_code','02','course','Math')) WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_obj_test` = JSON_INSERT(`json_obj_test`,'$.id',012923,'$.status',1) WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_arr_test` = JSON_MERGE_PRESERVE(`json_arr_test`->'$[0]',`json_arr_test`->'$[1]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_REMOVE(`json_arr_test`,'$[0]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_REPLACE(`json_arr_test`,'$[0]','[true, false]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_SET(`json_arr_test`,'$[0]','Wyao','$[1]','[true,false]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_UNQUOTE(`json_arr_test`) WHERE `json_obj_test`->'$.id' = 1541574430;
SELECT `id`, `json_arr_test` FROM lnmp WHERE `json_obj_test`->'$.id' = 1541574430;
SELECT JSON_DEPTH(json_obj_test) FROM lnmp;
SELECT JSON_LENGTH(json_obj_test) FROM lnmp;
SELECT JSON_TYPE(json_arr_test) FROM lnmp;
SELECT JSON_VALID(json_arr_test) FROM lnmp;