AI编程生活评测

MySQL 中 Json 字段的常见用法

编程笔记 / 2024-09-18 / 4 min
MySQL5.7.8 开始,MySQL支持 JSON 数据类型,可以有效访问 JSON 文档中的数据。这里记录一下关于 JSON 数据最常用的一些用法。 示例数据表结构:
CREATE TABLE `detail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `result` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
现有1条数据:
id result
1 {“msg”: “success”, “data”: [{“name”: “华宇大药房”, “address”: “北京市朝阳区顺义路115号”}], “status”: true}
JSON 数据为:
{
    "msg": "success",
    "data": [
        {
            "name": "华宇大药房",
            "address": "北京市朝阳区顺义路115号"
        }
    ],
    "status": true
}

查询

JSON 数据类型使用 column->'path' 的方式来访问需要的数据,注意这个 'path' 外层是有单引号的。其中
  • column 表示要查询的数据字段列名;
  • pathJSON 数据的访问路径,path格式为 $.path$[idx],支持多层嵌套访问;
  • $.path 用于 JSONObject 类型数据;
  • $[idx] 用于 JSONArray 类型数据;
  • $ 代表整个 JSON 数据的 root 节点;
  • path 为访问字段 key,如果字段名包含空格,则需要用双引号包住,如 $."nick name"
  • [idx] 是数组的索引;

查询 JSON 数据字段

使用上面的知识点,可以得到查询的 sql
SELECT
    `result` -> '$.status' `status`,
    `result` -> '$.msg' `msg`,
    `result` -> '$.data[0].name' `data_0_name` 
FROM
    `detail`
输出:
status msg data_0_name
true “success” “华宇大药房”
可以看到,这样查询到的属性还带有引号,可以使用 ->> 代替 ->,转义符也会去除。 新的sql:
SELECT
    `result` -> '$.status' `status`,
    `result` ->> '$.msg' `msg`,
    `result` ->> '$.data[0].name' `data_0_name` 
FROM
    `detail`
输出:
status msg data_0_name
true success 华宇大药房
这里的箭头等价于内置函数:
  • JSON_EXTRACT(column, path) 等价于 column->path
  • JSON_UNQUOTE(JSON_EXTRACT(column, path)) 等价于 column->>path
上面的 sql 可以使用内置函数来写:
SELECT
    JSON_EXTRACT( `result`, '$.status' ) `status`,
    JSON_UNQUOTE( JSON_EXTRACT( `result`, '$.msg' ) ) `msg`,
    JSON_UNQUOTE( JSON_EXTRACT( `result`, '$.data[0].name' ) ) `data_0_name` 
FROM
    `detail`

条件查询

SELECT * FROM `detail` WHERE `result` -> '$.status' = true

模糊查询

SELECT * FROM `detail` WHERE `result` -> '$.data[0].name' like '%华宇%'

更新

与更新对应的有几种不同的类型操作:

JSON_INSERT 新增字段

JSON_INSERT(json_doc, path, val[, path, val] ...) 会在路径上添加新的字段,不会改变已经存在的字段。 使用 JSON_INSERT 向这条数据中的 JSON 数据的 data 数组第一个对象数据中插入一个新的属性 "id": 610
UPDATE `detail`
SET 
`result` = JSON_INSERT(`result`, '$.data[0].id', 610)
WHERE id = 1
修改后的 JSON 数据:
{
    "msg": "success",
    "data": [
        {
            "id": 610,
            "name": "华宇大药房",
            "address": "北京市朝阳区顺义路115号"
        }
    ],
    "status": true
}

JSON_SET 更新或插入

函数 JSON_SET(json_doc, path, val[, path, val] ...) 更新或插入,使用 JSON_SET 将这条数据中的 JSON 数据的 data 数组第一个对象数据中的 name 修改为 新华宇大药房,同时新增 "phone": "18888888888"
UPDATE `detail`
SET 
`result` = JSON_SET(`result`, '$.data[0].name', '新华宇大药房', '$.data[0].phone', '18888888888')
WHERE id = 1
更新后的 JSON
{
    "msg": "success",
    "data": [
        {
            "id": 610,
            "name": "新华宇大药房",
            "phone": "18888888888",
            "address": "北京市朝阳区顺义路115号"
        }
    ],
    "status": true
}

JSON_REPLACE 更新

函数 JSON_REPLACE(json_doc, path, val[, path, val] ...) 只更新,用法与上面类似。
UPDATE `detail`
SET 
`result` = JSON_REPLACE(`result`, '$.data[0].name', '新新华宇大药房')
WHERE id = 1

JSON_REMOVE 删除

函数 JSON_REMOVE(json_doc, path[, path] ...) 删除对象中的字段或删除数组中对应索引上的值。
UPDATE `detail`
SET 
`result` = JSON_REMOVE(`result`, '$.data[0].phone')
WHERE id = 1
删除后的 JSON
{
    "msg": "success",
    "data": [
        {
            "id": 610,
            "name": "新华宇大药房",
            "address": "北京市朝阳区顺义路115号"
        }
    ],
    "status": true
}
这里只记录了最基本的使用,更多 JSON 数据相关的操作请参考:MySQL – JSON 数据类型
点击刷新