mysql8之json/数组的增删改查

您所在的位置:网站首页 mysql字符串转json数组 mysql8之json/数组的增删改查

mysql8之json/数组的增删改查

2024-07-13 20:14| 来源: 网络整理| 查看: 265

前言,类型必须是json,虽然text也可以,但是很多操作没法使用,比如查询,当然了,这种类型还可以存储数组类似 varchar,设置 JSON 主要将字段的 type 是 json, 不能设置长度,可以是 NULL 但不能有默认值。创建json

json_array 创建json数组 json_object 创建json对象

查询json

json_contains 判断是否包含某个json值 column->>path json_unquote(column -> path)的简洁写法 json_keys 提取json中的键值为json数组 json_search 按给定字符串关键字搜索json,返回匹配的路径

修改json

json_array_append 末尾添加数组元素,如果原有值是数值或json对 象,则转成数组后,再添加元素 json_array_insert 插入数组元素 json_insert 插入值(插入新值,但不替换已经存在的旧值) json_merge 合并json数组或对象 json_remove 删除json数据 json_replace 替换值(只替换已经存在的旧值) json_set 设置值(替换旧值,并插入不存在的新值) json_unquote 去除json字符串的引号,将值转成string类型

返回json属性

json_depth 返回json文档的最大深度 json_length 返回json文档的长度 json_type 返回json值得类型 json_valid 判断是否为合法json文档

MySQL 也有专门的函数 JSON_OBJECT,JSON_ARRAY 生成 json 格式的数据,但是吧,使用的时候有注意点,尽量之间写进去吧

//JSON_OBJECT必须是偶数,嵌套时必须搭配JSON_ARRAY INSERT INTO `a_goods` (`attrs`, `type`) VALUES ( JSON_OBJECT("name","张三","age",20,"strage","20","data",JSON_ARRAY("新品","热销",1,"0")), JSON_ARRAY("新品","热销",1,"0") )

查询一般对应字符串类型的 category->’$.name’ 中还包含着双引号,这其实并不是想要的结果,可以用 JSON_UNQUOTE 函数将双引号去掉,从 MySQL 5.7.13 起也可以通过这个操作符 * ->> *这个和 JSON_UNQUOTE 是等价的,查询json的值,即键的值。

SELECT attrs->'$.name' as name, JSON_UNQUOTE(attrs->'$.name'), attrs->>'$.name' FROM a_goods /* SELECT attrs->'$.name' as name, 查询json数据中的name的值并赋值给name JSON_UNQUOTE(attrs->'$.name'), attrs->>'$.name' FROM a_goods */

json中的where 语句。

SELECT * FROM a_goods WHERE type = CAST('["新品","热销",1,"0"]' as JSON) //查询json是否在数据库的存在,其实就相当于 `where a=1` 只不过这个a得转换一下 //CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型 SELECT * FROM a_goods WHERE attrs->>'$.age' = '20' //要特别注意的是,JSON 中的元素搜索是严格区分变量类型的,比如说整型和字符串是严格区分的,即 “20”和20 SELECT * FROM a_goods WHERE JSON_CONTAINS(attrs, '20', '$.age') SELECT * FROM a_goods WHERE JSON_CONTAINS(type, '"新品"') //用JSON_CONTAINS 函数,但和 *column->path *的形式有点相反的是,JSON_CONTAINS 第二个参数是不接受整数的,无论 json 元素是整型还是字符串,否则会出现错误

更新更新数组按以往的更新就行

UPDATE a_goods SET type = '["demo","0",1]'

但如果要更新 JSON 下的元素,MySQL 并不支持 *column->path *的形式,则可能要用到以下几个函数JSON_INSERT() 插入新值,但不会覆盖已经存在的值

UPDATE a_goods SET category = JSON_INSERT(category, '$.name', 'lnmp', '$.url', 'www.lnmp.cn') WHERE id = 1;

但如果要更新 JSON 下的元素,MySQL 并不支持 *column->path *的形式,则可能要用到以下几个函数JSON_INSERT() 插入新值,但不会覆盖已经存在的值,修改的是JSON对象

UPDATE a_goods SET category = JSON_INSERT(category, '$.name', 'lnmp', '$.url', 'www.lnmp.cn') WHERE id = 1;

JSON_SET() 插入新值,并覆盖已经存在的值,修改的是JSON对象

UPDATE a_goods SET category = JSON_SET(category, '$.host', 'www.lnmp.cn', '$.url', 'http://www.lnmp.cn') WHERE id = 1;

JSON_REPLACE() 只替换存在的值,修改的是JSON对象

UPDATE a_goods SET category = JSON_REPLACE(category, '$.name', 'php', '$.url', 'http://www.php.net') WHERE id = 1

JSON_REMOVE() 删除 JSON 元素,修改的是JSON对象,可以删除多个JSON值

UPDATE a_goods SET category = JSON_REMOVE(category, '$.url', '$.host') WHERE id = 1;

总结:以上是JSON对象和JSON数组的多个MySQL8函数的总结



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3