Mysql 5.7之后开始支持Json格式的原生字段类型,现将json新特性作如下整理,仅供参考。
Mysql官方给出的json相关的函数,完整列表如下:
https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html 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数组 |
|
column->path |
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. |
UPDATE lnmp SET `name`="Wyaooo" WHERE `json_obj_test`->'$.id' = 1541560547; |
严格控制变量的数据类型,string类型一定要加引号 |
JSON_INSERT、JSON_REPLACE、JSON_SET三者的比较:
(1)JSON_SET()替换现有值,并添加新的值;
(2)JSON_INSERT()添加新值,但是并不会替换已经存在的值;
(3)JSON_REPLACE()只用来替换已经存在的值,否则不做操作。
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;