mysql哪个版本开始支持json_MySQL支持JSON类型

本文介绍了MySQL从5.7版本开始支持JSON数据类型,包括其优势,如自动验证和最佳存储格式。文章通过示例展示了如何创建、搜索和修改JSON值,探讨了JSON_EXTRACT、JSON_REPLACE、JSON_SET等操作,并对比了它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于最近实验室接手了一个新的项目,涉及了大量的数据变量作存储,想到如果一个数据变量作为一个字段来存储的话效率太低,当某些数据为空时会造成大量的资源浪费,然后就发现了MySQL的JSON支持,先点个赞!

MySQL从5.7版本之后开始支持JSON数据类型,相比于JSON格式的字符串类型有如下优势:

存储在JSON列中的JSON文档的会被自动验证。无效的文档会产生错误;

最佳存储格式。存储在JSON列中的JSON文档会被转换为允许快速读取文档元素的内部格式。

存储在JSON列中的任何JSON文档的大小都受系统变量max_allowed_packet的值的限制,可以使用JSON_STORAGE_SIZE()函数获得存储JSON文档所需的空间。

下面直接上代码

1、创建JSON值

mysql> INSERT INTO t_json VALUES(JSON_ARRAY('json_array'));

Query OK, 1 row affected (0.19 sec)

mysql> INSERT INTO t_json VALUES(JSON_OBJECT('key','hello'));

Query OK, 1 row affected (0.09 sec)

mysql> INSERT INTO t_json VALUES(JSON_MERGE_PRESERVE(JSON_OBJECT('key','hello'),JSON_ARRAY(1,2)));

Query OK, 1 row affected (0.14 sec)

mysql> SELECT * FROM t_json;

+--------------------------------------+

| jdoc |

+--------------------------------------+

| [1, 2] |

| {"key1": "value1", "key2": "value2"} |

| "HELLO" |

| ["json_array"] |

| {"key": "hello"} |

| [{"key": "hello"}, 1, 2] |

+--------------------------------------+

6 rows in set (0.00 sec)

2、搜索和修改JSON值

路径语法

.keyName:JSON对象中键名为keyName的值;

对于不合法的键名(如有空格),在路径引用中必须用双引号"将键名括起来,例."key name";

[index]:JSON数组中索引为index的值,JSON数组的索引同样从0开始;

[index1 to index2]:JSON数组中从index1到index2的值的集合;

.*: JSON对象中的所有value;

[*]: JSON数组中的所有值;

prefix**suffix: 以prefix开头并以suffix结尾的路径;

**.keyName为多个路径,如对于JSON对象'{"a": {"b": 1}, "c": {"b": 2}}','$**.b'指路径$.a.b和$.c.b;

不存在的路径返回结果为NULL;

前导$字符表示当前正在使用的JSON文档;

例子:对于数组[3, {"a": [5, 6], "b": 10}, [99, 100]]

$[1]为{"a": [5, 6], "b": 10};

[1].a为[5, 6];

$[1].a[1]为 6;

$[1].b为 10;

$[2][0]为 99。

2.1 搜索

JSON对象

mysql> SELECT JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.name');

+--------------------------------------------------------+

| JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.name') |

+--------------------------------------------------------+

| "Taylor" |

+--------------------------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.*');

+-----------------------------------------------------+

| JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.*') |

+-----------------------------------------------------+

| [29, "Taylor"] |

+-----------------------------------------------------+

1 row in set (0.00 sec)

JSON数组

mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[1]');

+-----------------------------------------+

| JSON_EXTRACT('["a", "b", "c"]', '$[1]') |

+-----------------------------------------+

| "b" |

+-----------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[1 to 2]');

+----------------------------------------------+

| JSON_EXTRACT('["a", "b", "c"]', '$[1 to 2]') |

+----------------------------------------------+

| ["b", "c"] |

+----------------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[*]');

+-----------------------------------------+

| JSON_EXTRACT('["a", "b", "c"]', '$[*]') |

+-----------------------------------------+

| ["a", "b", "c"] |

+-----------------------------------------+

1 row in set (0.00 sec)

2.2 修改

JSON_REPLACE和JSON_SET的区别

// 旧值存在

mysql> SELECT JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.name', 'Mere');

+----------------------------------------------------------------+

| JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.name', 'Mere') |

+----------------------------------------------------------------+

| {"id": 29, "name": "Mere"} |

+----------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_SET('{"id": 29, "name": "Taylor"}', '$.name', "Mere");

+------------------------------------------------------------+

| JSON_SET('{"id": 29, "name": "Taylor"}', '$.name', 'Mere') |

+------------------------------------------------------------+

| {"id": 29, "name": "Mere"} |

+------------------------------------------------------------+

1 row in set (0.00 sec)

// 旧值不存在

mysql> SELECT JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere');

+---------------------------------------------------------------+

| JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere') |

+---------------------------------------------------------------+

| {"id": 29, "name": "Taylor"} |

+---------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_SET('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere');

+-----------------------------------------------------------+

| JSON_SET('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere') |

+-----------------------------------------------------------+

| {"id": 29, "cat": "Mere", "name": "Taylor"} |

+-----------------------------------------------------------+

1 row in set (0.00 sec)

JSON_INSERT与JSON_SET的区别

// 旧值存在

mysql> SELECT JSON_INSERT('[1, 2, 3]', '$[1]', 4);

+-------------------------------------+

| JSON_INSERT('[1, 2, 3]', '$[1]', 4) |

+-------------------------------------+

| [1, 2, 3] |

+-------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_SET('[1, 2, 3]', '$[1]', 4);

+----------------------------------+

| JSON_SET('[1, 2, 3]', '$[1]', 4) |

+----------------------------------+

| [1, 4, 3] |

+----------------------------------+

1 row in set (0.00 sec)

//旧值不存在

mysql> SELECT JSON_INSERT('[1, 2, 3]', '$[4]', 4);

+-------------------------------------+

| JSON_INSERT('[1, 2, 3]', '$[4]', 4) |

+-------------------------------------+

| [1, 2, 3, 4] |

+-------------------------------------+

1 row in set (0.00 sec)

mysql> SELECT JSON_SET('[1, 2, 3]', '$[4]', 4);

+----------------------------------+

| JSON_SET('[1, 2, 3]', '$[4]', 4) |

+----------------------------------+

| [1, 2, 3, 4] |

+----------------------------------+

1 row in set (0.00 sec)

### 关于MySQL为什么不支持JSON_CONTAINS_PATH和JSON_SEARCH函数 在早期版本中,MySQL确实存在对于某些特定JSON操作的支持不足的情况。然而,在较新的版本里,这些功能已经被加入并得到了改进。 实际上,自MySQL 5.7起已经引入了`JSON_CONTAINS_PATH()` 和 `JSON_SEARCH()` 函数来处理复杂的查询需求[^1]。这意味着当前大多数主流使用的MySQL版本都应当具备这两个函数的功能支持。 如果遇到不支持上述两个函数的情形,通常是因为所使用的MySQL版本过低。建议升级到至少MySQL 5.7或更高版本以获得完整的JSON处理能力。 #### 替代解决方案 当无法立即更新数据库版本时,可以考虑以下几种方法作为临时解决措施: - **使用其他内置函数组合实现相同效果** 通过结合使用`->>`运算符以及其他字符串匹配函数如`LIKE`, `%`通配符等,可以在一定程度上模拟出类似的路径查找行为。 ```sql SELECT * FROM table_name WHERE JSON_UNQUOTE(JSON_EXTRACT(json_column, '$.path.to.key')) LIKE '%search_value%'; ``` 这种方法虽然不如原生函数高效,但在必要情况下仍能解决问题。 - **应用程序层面解析** 另一种方式是在应用层面对返回的数据进行额外加工。即先获取整个JSON对象再利用编程语言中的库来进行更精确的搜索定位工作。 例如Python中有专门用于处理json数据结构的标准模块`json`: ```python import json def search_in_json(data_str, key_to_find): data_dict = json.loads(data_str) def _find_key(d, target_key): if isinstance(d, dict): for k, v in d.items(): if k == target_key or (_find_key(v, target_key)): yield v return list(_find_key(data_dict, key_to_find)) ``` 此代码片段展示了如何在一个嵌套字典中寻找指定键对应的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值