Mysql / MariaDB 操作 《 json 》 字段
Mysql / MariaDB 操作 《 json 》 字段
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- Mysql / MariaDB 操作 《 json 》 字段
- 前言
- 环境
- 一、数据库结构
- 二、使用方法
- 1.查找 json_value 字段中 a字段 等于1
- 三、常用方法
- 总结
前言
问题:
在使用mysql的过程中会有一些需求,需要把json(字典)或者数组json存到一个字段中,这样存取会比较方便
但是如果需要筛选则需要把这个字段里的数据查出来在程序中逐个筛选。
解决方案:
使用mysql自带函数直接筛选
环境
数据库:10.3.24-MariaDB (**<font color="red">如果是mysql需要大于5.7版本</font>**)
文档:[JSON_SEARCH - MariaDB Knowledge Base](https://mariadb.com/kb/en/json_search/) https://mariadb.com/kb/en/json_search/
一、数据库结构
CREATE TABLE `json_test` (
`id` int(64) NOT NULL AUTO_INCREMENT COMMENT ' id',
`json_value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT 'json',
`json_arr_value` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '数组json',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_id`(`id`) USING BTREE
)
MariaDB [env]> select * from json_test;
+-----+----------------------+-----------------------------+
| id | json_value | json_arr_value |
+-----+----------------------+-----------------------------+
| 134 | {"a": "1", "b": "2"} | [{"a": "te", "b": "te"}] |
| 135 | {"a": "3", "b": "4"} | [{"a": "tes", "b": "test"}] |
+-----+----------------------+-----------------------------+
json_value 是 json格式
json_arr_value 是 arr[json]格式
二、使用方法
1.查找 json_value 字段中 a字段 等于1
JSON_VALUE 函数 (返回json中的值,可以用来模糊查找)
select * from json_test where json_value(json_value, '$.a') = '1'
JSON_CONTAINS 函数 (找到了返回1,没找到返回0)
JSON_QUOTE (对数据进行转义,字符串加双引号)
select * from json_test where JSON_CONTAINS(json_value, JSON_QUOTE('1'), '$.a')
JSON_EXTRACT 函数 (根据路径提取值)
select * from json_test where JSON_EXTRACT(json_value, '$.a') = '1'
JSON_SEARCH 函数 (搜索值返回值的索引)
select * from json_test where JSON_SEARCH(json_value, 'all', '1') is not null
三、常用方法
方法名 | 参数 | 使用方法 | 备注 |
JSON_EXISTS | (json数据,键名) | json_exists(‘{“a”: “1”}’, “$.a”) | 找到返回1,没找到返回0 |
JSON_SEARCH | (json数据,value值) | JSON_SEARCH(json_value, ‘all’, ‘1’) | 返回值所在的索引 |
JSON_VALUE | (json数据,键名) | json_value(json_value, ‘$.a’) | 返回value值(不带引号) |
JSON_CONTAINS | (json数据,value值,键名) | JSON_CONTAINS(json_value, JSON_QUOTE(‘1’), ‘$.a’) | 找到了返回1,没找到返回0 |
JSON_EXTRACT | (json数据,键名) | JSON_EXTRACT(json_value, ‘$.a’) | 根据路径提取值(带引号) |
总结