mysql5.7 新增的json欄位型別
一、我們先建立一個表,準備點資料
CREATE TABLE `json_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `json` json DEFAULT NULL COMMENT 'json資料', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
二、檢索json列的欄位
通過使用 -> 或 ->> 運算子檢索json列的欄位
select id, json->'$[0].items[0].name' from json_test;
select id, json->>'$[0].items[0].name' from json_test;
使用 -> 和 ->> 的區別是結果用了引號包裹。
三、處理json的一些函式
JSON_PRETTY(json_val) 以優雅的格式顯示json值
select id, JSON_PRETTY(json) from json_test\G;
JSON_CONTAINS(target, candidate[, path]) 判斷給定的candidate是否包含在target中,如果指定了path,則在指定路徑中進行查詢。
注意,注意,注意,這裡的candidate如果是數字,需要用單引號包裹,如果是字串,單引號裡再加上雙引號包裹。
select JSON_CONTAINS(json->'$[0].name', '"1號籃子"') from json_test; select JSON_CONTAINS(json, '"1號籃子"', '$[0].name') from json_test;
JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...) 判斷json_doc中的路徑是否存在,通俗點說就是json中的key是否存在
select JSON_CONTAINS_PATH(json, 'one', '$[0].name', '$[0].test') from json_test;
第二個引數'one'表示只要有一個key存在就返回1,否則為0
select JSON_CONTAINS_PATH(json, 'all', '$[0].name', '$[0].test') from json_test;
第二個引數'all'表示所有key存在才返回1,否則為0
JSON_SET(json_doc, path, val[, path, val] ...) 插入或更新資料並返回結果
select JSON_SET(json, '$[0].name', '2號籃子', '$[0].test', 'test') from json_test;
我們修改$[0].name的值,並新增一個key為test,值為test的項
JSON_INSERT(json_doc, path, val[, path, val] ...) 插入資料並返回結果,但不替換現有值。
select JSON_INSERT(json, '$[0].name', '2號籃子', '$[0].exts', '擴充套件') from json_test;
這時$[0].name不會被更新,只會新增一個欄位$[0].exts
JSON_REPLACE(json_doc, path, val[, path, val] ...) 替換現有值並返回結果
select JSON_REPLACE(json, '$[0].name', '替換') from json_test;
將$[0].name中的值替換成新值
JSON_REMOVE(json_doc, path[, path] ...) 刪除資料並返回結果
select JSON_REMOVE(json, '$[0].name') from json_test;
刪除$[0].name這項資料
JSON_KEYS(json_doc[, path]) 獲取json文件中的所有鍵
select JSON_KEYS(json, '$[0]') from json_test;
獲取$[0]路徑下的所有鍵
JSON_LENGTH(json_doc[, path]) 獲取json文件的長度
select JSON_LENGTH(json, '$[0]') from json_test;
獲取$[0]下的元素數量
JSON_EXTRACT(json_doc, path[, path] ...) 返回json文件中的資料
select JSON_EXTRACT(json, '$[0]') from json_test; select JSON_EXTRACT(json, '$[0].name') from json_test;
返回json文件指定路徑下的資料
JSON_ARRAY([val[, val] ...]) 建立json陣列
select JSON_ARRAY(1, '2', true, 5.6, null, now());
JSON_OBJECT([key, val[, key, val] ...]) 通過鍵值對, 建立json物件
select JSON_OBJECT('name', 'xiaoxu', 'age', 28, 'height', 1.72);
注意,這裡鍵和值要成對出現
JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...) 合併json文件,如果有重複鍵,後面的資料覆蓋前面的
select JSON_MERGE_PATCH('{"name":"test1"}', '{"name":"test2"}');
JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...) 合併json文件,如果有重複鍵,則會通過陣列把值都儲存起來
select JSON_MERGE_PRESERVE('{"name":"test1"}', '{"name":"test2"}');
JSON_QUOTE(string) 通過用雙引號字元包裹並轉義內部引號和其他字元
select JSON_QUOTE('你好"世界"');
JSON_UNQUOTE(json_val) 將轉義字元轉換回普通字元
select JSON_UNQUOTE('你好\\t\"世界\"');