mysql json追加_MySQL 5.7 新增加的 JSON 特性对应的 json 方法

新项目要设置一个可以动态添加各种字段的属性,一直不想直接以修改数据表列的形式来实现,不仅不优雅,而且如果项目中的每个元素需要增加的属性数量不一致或者是完全南辕北辙的话,那么表就完全乱了。

于是想到了以前的一个项目是靠着横纵表的形式实现的,就是把不确定的每个属性转成一行行的记录,这样就相当于把数据表中不确定的列转成了一行行的记录,这么做的话,每个元素多几个属性少几个属性,无非也就是记录行数的差异,完全不影响了。但是这种方式有个弊端就是在查询的时候很不方便,需要把横表转成纵表才行。

正纠结着忽然就想起来MySQL最新版(5.7)开始支持JSON形式的数据了,这样的话,多存一列的数据,无非就是增加一个key,value了。

于是在网上搜了一下,说这方面的比较少,因此自己找到官方的说明,详细看了看,记下来,留待以后看。

MySQL 函数分为四类,分别是创建(Create JSON Values)、修改(Modify JSON Values)、查询(Search JSON Values)以及返回json相关属性(Return JSON Value Attributes)的方法。

创建类的方法

JSON_ARRAY([val[, val] ...])

创建JSON数组形式的数据

SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());

[1, "abc", null, true, "11:30:24.000000"]

JSON_OBJECT([key, val[, key, val] ...])

创建一个JSON对象

SELECT JSON_OBJECT('id', 87, 'name', 'carrot');

{"id": 87, "name": "carrot"}

修改类的方法

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)

在JSON数组后增加新的数据

mysql> SET @j = '["a", ["b", "c"], "d"]';

mysql> SELECT JSON_ARRAY_APPEND(@j, '$[1]', 1);

["a", ["b", "c", 1], "d"]

JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)

插入数据到JSON中,path为插入的路径

mysql> SET @j = '["a", {"b": [1, 2]}, [3, 4]]';

mysql> SELECT JSON_ARRAY_INSERT(@j, '$[1]', 'x');

["a", "x", {"b": [1, 2]}, [3, 4]]

JSON_MERGE(json_doc, json_doc[, json_doc] ...)

合并JSON数据

SELECT JSON_MERGE('[1, 2]', '[true, false]');

[1, 2, true, false]

JSON_REMOVE(json_doc, path[, path] ...)

删除一部分JSON数据

mysql> SET @j = '["a", ["b", "c"], "d"]';

mysql> SELECT JSON_REMOVE(@j, '$[1]');

["a", "d"]

JSON_REPLACE(json_doc, path, val[, path, val] ...)

替换一部分JSON数据

mysql> SET @j = '{ "a": 1, "b": [2, 3]}';

mysql> SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]');

{"a": 10, "b": [2, 3]}

JSON_SET(json_doc, path, val[, path, val] ...)

有存在的数据就替换,没有就插入

mysql> SET @j = '{ "a": 1, "b": [2, 3]}';

mysql> SELECT JSON_SET(@j, '$.a', 10, '$.c', '[true, false]');

{"a": 10, "b": [2, 3], "c": "[true, false]"}

查询类方法

JSON_CONTAINS(json_doc, val[, path])

查找是否包含

mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';

mysql> SET @j2 = '1';

mysql> SELECT JSON_CONTAINS(@j, @j2, '$.a');

1

mysql> SELECT JSON_CONTAINS(@j, @j2, '$.b');

0

JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)

查找path(一般就是key)是否存在

mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';

mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e');

1

mysql> SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e');

0

JSON_EXTRACT(json_doc, path[, path] ...)

分解JSON 并查询,实际上就是在提供的path下查找值

mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');

20

mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]');

[20, 10]

JSON_EXTRACT 的替代语法 column->path

以下两种方式等价

mysql> SELECT c, JSON_EXTRACT(c, "$.id"), g

> FROM jemp

> WHERE JSON_EXTRACT(c, "$.id") > 1

> ORDER BY JSON_EXTRACT(c, "$.name");

mysql> SELECT c, c->"$.id", g

> FROM jemp

> WHERE c->"$.id" > 1

> ORDER BY c->"$.name";

JSON_KEYS(json_doc[, path])

提出当前提供path下的key值

SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');

["a", "b"]

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

按着提供的值去查询,返回path数组

mysql> SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';

mysql> SELECT JSON_SEARCH(@j, 'one', 'abc');

"$[0]"

mysql> SELECT JSON_SEARCH(@j, 'all', 'abc');

["$[0]", "$[2].x"]

查询JSON自有属性的方法

JSON_DEPTH(json_doc)

查询当前JSON深度

SELECT JSON_DEPTH('[10, {"a": 20}]');

3

JSON_LENGTH(json_doc[, path])

查询当前层级(path)下对象或者数组的元素数量

mysql> SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}');

2

JSON_TYPE(json_val)

返回JSON值类型

mysql> SET @j = '{"a": [10, true]}';

mysql> SELECT JSON_TYPE(@j);

OBJECT

SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a'));

ARRAY

JSON_VALID(val)

验证是否是JSON

mysql> SELECT JSON_VALID('{"a": 1}');

1

SELECT JSON_VALID('hello'), JSON_VALID('"hello"');

0,1

以上是基本的方法。

后续有机会,在PHP上做些实验的话,在详细分享一下。

注:以上内容参考自官方文档:https://dev.mysql.com/doc/refman/5.7/en/json-functions.html

说的不是很详细,详细的话请参考官方文档。

(责任编辑:最模板)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 5.7开始支持JSON数据类型,可以将JSON字符串存储在数据库。下面是存储JSON字符串(数组)的操作: 1. 创建表时指定JSON类型的字段 创建表时,可以使用JSON类型来定义一个字段,例如: ```sql CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `json_data` json DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 这里定义了一个名为`json_data`的JSON类型的字段。 2. 插入JSON数据 插入JSON数据时,可以使用`JSON_OBJECT()`函数创建一个JSON对象,或者使用`JSON_ARRAY()`函数创建一个JSON数组。 例如,插入一个JSON对象: ```sql INSERT INTO `test` (`json_data`) VALUES (JSON_OBJECT('name', 'John', 'age', 30)); ``` 插入一个JSON数组: ```sql INSERT INTO `test` (`json_data`) VALUES (JSON_ARRAY('apple', 'banana', 'orange')); ``` 3. 查询JSON数据 查询JSON数据时,可以使用`JSON_EXTRACT()`函数提取JSON对象或数组的某个值。 例如,查询`json_data`字段的`name`值: ```sql SELECT JSON_EXTRACT(`json_data`, '$.name') FROM `test`; ``` 查询`json_data`字段的第二个元素: ```sql SELECT JSON_EXTRACT(`json_data`, '$[1]') FROM `test`; ``` 4. 更JSON数据 更JSON数据时,可以使用`JSON_SET()`函数或`JSON_REPLACE()`函数。 例如,将`json_data`字段的`age`值更为`40`: ```sql UPDATE `test` SET `json_data` = JSON_SET(`json_data`, '$.age', 40) WHERE `id` = 1; ``` 将`json_data`字段的第二个元素更为`grape`: ```sql UPDATE `test` SET `json_data` = JSON_REPLACE(`json_data`, '$[1]', 'grape') WHERE `id` = 2; ``` 以上就是MySQL存储JSON字符串(数组)的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值