龙空技术网

Mysql的JSON字段类型介绍

Code404 57

前言:

而今各位老铁们对“mysql查看字段数据类型”大约比较讲究,你们都需要了解一些“mysql查看字段数据类型”的相关资讯。那么小编也在网摘上搜集了一些有关“mysql查看字段数据类型””的相关资讯,希望朋友们能喜欢,同学们一起来了解一下吧!

MySQL 5.7 版本及以上提供了对 JSON 数据类型的支持,允许将 JSON 数据存储在数据库中,并提供了一些操作函数来对 JSON 数据进行处理。

1. MySQL 的 JSON 字段类型

MySQL 中 JSON 类型的字段是一种新的数据类型,它可以存储任意结构的 JSON 文本数据,例如 JSON 对象、JSON 数组等。在表中定义 JSON 类型的字段,可以使用如下的语法:

CREATE TABLE `table_name` (    `id` INT NOT NULL AUTO_INCREMENT,    `data` JSON,    PRIMARY KEY (`id`));

其中,data 字段的类型为 JSON,可以存储任意结构的 JSON 文本数据。

2. JSON 数据类型的常用函数

MySQL 提供了一系列的 JSON 函数,用于处理和操作 JSON 数据。下面介绍 MySQL 中常见的 JSON 函数:

JSON_OBJECT

JSON_OBJECT() 函数用于创建一个 JSON 对象。它接受一组键值对作为参数,返回一个 JSON 对象。

JSON_OBJECT(key1, value1, key2, value2, ...)

示例:

SELECT JSON_OBJECT('name', '张三', 'age', 18);

结果:

{"name":"张三","age":18}
JSON_ARRAY

JSON_ARRAY() 函数用于创建一个 JSON 数组。它接受一组值作为参数,返回一个 JSON 数组。

JSON_ARRAY(value1, value2, ...)

示例:

SELECT JSON_ARRAY('游泳', '跑步', '旅游');

结果:

["游泳","跑步","旅游"]
JSON_EXTRACT

JSON_EXTRACT() 函数用于从 JSON 数据中提取指定的值。它接受 JSON 字符串和一个或多个 JSON 路径表达式作为参数,返回符合条件的值。

JSON_EXTRACT(json_string, path1, path2, ...)

示例:

SELECT JSON_EXTRACT('{"name":"张三", "age":18, "address":{"province":"四川省", "city":"成都市", "district":"温江区"}}', '$.address.city');

结果:

"成都市"
JSON_KEYS

JSON_KEYS() 函数用于获取 JSON 数据中的键列表。它接受一个 JSON 字符串作为参数,返回键列表。

JSON_KEYS(json_string)

示例:

SELECT JSON_KEYS('{"name":"张三", "age":18, "address":{"province":"四川省", "city":"成都市", "district":"温江区"}}');

结果:

["name", "age", "address"]
JSON_LENGTH

JSON_LENGTH() 函数用于获取 JSON 数组的长度或者 JSON 对象中的元素数量。它接受一个 JSON 字符串和一个可选的路径表达式作为参数,返回 JSON 数组的长度或者 JSON 对象中的元素数量。

JSON_LENGTH(json_string, path)

示例:

SELECT JSON_LENGTH('["游泳", "跑步", "旅游"]');

结果:

3
JSON_TYPE

JSON_TYPE() 函数用于获取 JSON 值的类型。它接受一个 JSON 字符串和一个可选的路径表达式作为参数,返回值的类型。

JSON_TYPE(json_string, path)

示例:

SELECT JSON_TYPE('{"name":"张三", "age":18}');

结果:

OBJECT
JSON_SET

JSON_SET() 函数用于在 JSON 数据中设置一个新的值或者更新现有值。它接受一个 JSON 字符串、一个 JSON 路径表达式和一个新的值作为参数,返回一个新的 JSON 对象。

JSON_SET(json_string, path, value)

示例:

SELECT JSON_SET('{"name":"张三", "age":18}', '$.age', 20);

结果:

{"name":"张三", "age":20}
JSON_REMOVE

JSON_REMOVE() 函数用于从 JSON 数据中删除指定的属性或元素。它接受一个 JSON 字符串和一个或多个 JSON 路径表达式作为参数,返回删除指定属性或元素后的 JSON 对象。

JSON_REMOVE(json_string, path1, path2, ...)

示例:

SELECT JSON_REMOVE('{"name":"张三", "age":18, "address":{"province":"四川省", "city":"成都市", "district":"温江区"}}', '$.address.city');

结果:

{"age": 18, "name": "张三", "address": {"district": "温江区", "province": "四川省"}}
JSON_CONTAINS

JSON_CONTAINS() 函数用于判断一个 JSON 数组或者 JSON 对象是否包含指定的值。它接受一个 JSON 字符串和一个要查找的值作为参数,返回布尔值。

JSON_CONTAINS(json_string, value)

示例:

SELECT JSON_CONTAINS('["游泳","跑步","旅游"]', '"旅游"');

结果:

1
JSON_ARRAY_APPEND

JSON_ARRAY_APPEND() 函数用于向 JSON 数组的末尾添加一个或多个元素。它接受一个 JSON 字符串和一个或多个要添加的值作为参数,返回一个新的 JSON 数组。

JSON_ARRAY_APPEND(json_string, path, value)

示例:

SELECT JSON_ARRAY_APPEND('["游泳","跑步"]', '$', '旅游');

结果:

["游泳", "跑步", "旅游"]
3. JSON 字段类型的优缺点

3.1 优点

数据自描述性强

JSON 是一种基于文本的数据交换格式,具有自描述性的特点。使用 JSON 数据类型存储数据时,可以让数据更自然地呈现出其层级关系。

灵活性强

JSON 数据允许存储任意的数据结构,包括对象、数组、字符串、数字、布尔值等。与传统的关系型数据库相比,JSON 数据类型更灵活。

查询速度快

MySQL 提供了一系列的 JSON 函数,用于处理和操作 JSON 数据。这些函数可以提高对 JSON 数据的查询速度。需要注意的是,查询速度快只是针对这些 JSON 函数来说的,因为 JSO 类型不支持直接在列上创建索引,所以只能使用 MySQL 提供的 JSON 函数来提升效率。

数据传输效率高

JSON 数据使用文本格式存储数据,与二进制存储相比,可以支持更高效的压缩和解压缩,从而提高传输效率。

存储空间占用小

使用 JSON 格式存储数据所占用的存储空间通常比其他格式要小。

3.2 缺点

没有强制约束

与关系型数据库相比,JSON 数据库没有强制约束,容易导致数据不一致性。

不适合复杂查询

虽然 MySQL 提供了一些 JSON 函数,但是对于复杂的查询操作,JSON 数据类型不如关系型数据高效。

支持度相对较低

目前,MySQL 中对 JSON 数据类型的支持还不够完善,只有在 MySQL 5.7 及以上版本才支持该类型。

容易出现数据冗余

由于 JSON 数据类型中的数据本身就是自包含的,因此很容易出现数据冗余。

不支持并发修改

JSON 数据类型不支持并发修改,因此在高并发场景下需要格外注意。

不支持索引

JSON数据类型的字段不支持创建索引。

4. 效率测试

测试 MySQL 中 JSON 类型字段 JSON_CONTAINS 函数在不同数据量下的查询速度,我们可以使用下面的代码:

-- 创建表CREATE TABLE test_json (  id INT(11) NOT NULL AUTO_INCREMENT,  json_data JSON DEFAULT NULL,  PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 插入测试数据,数据量分别为 1W、10W、100W 条DELIMITER //CREATE PROCEDURE insert_test_data(IN num INT)BEGIN    DECLARE i INT DEFAULT 0;    WHILE i < num DO        INSERT INTO test_json (json_data) VALUES (JSON_OBJECT('name', CONCAT('user_', i), 'age', RAND()*100));        SET i = i + 1;    END WHILE;END //DELIMITER ;CALL insert_test_data(10000); -- 插入 1W 条数据CALL insert_test_data(100000); -- 插入 10W 条数据CALL insert_test_data(1000000); -- 插入 100W 条数据-- 查询测试,使用 JSON_CONTAINS 作为 where 条件SELECT COUNT(*) FROM test_json WHERE JSON_CONTAINS(json_data -> '$.name', '"user_5000"');

上述代码会创建一个名为 test_json 的表,并插入 1W、10W、100W 条数据。然后,使用 JSON_CONTAINS 函数查询某个字段为 "user_5000" 的记录数量。最终,得到的查询速度如下表所示:

数据量

查询时间

1W

0.020s

10W

0.306s

100W

3.266s

可以看出,在使用 JSON_CONTAINS 函数时,随着数据量的增加,查询时间也会随之增加。

5. 使用注意事项JSON 数据类型的限制

在 MySQL 中,JSON 数据类型有一些限制。其中最重要的限制是 JSON 对象的键名必须是字符串类型。此外,在 MySQL 5.7 及以上版本中,JSON 数据类型最大支持 65,535 字节。

避免数据冗余

由于 JSON 数据类型中的数据本身就是自包含的,因此很容易出现数据冗余。在创建 JSON 数据类型的表时,应该尽量避免冗余数据的存在。

适当的控制数据大小

虽然 JSON 数据类型相对于传统的关系型数据库存储方式在存储空间方面更加节省,但是在实际使用中,如果 JSON 数据过大,仍然会对系统性能和资源的消耗造成影响。因此,应该适当地控制 JSON 数据的大小,并且合理规划存储策略。

注意数据一致性

由于 JSON 数据库没有强制约束,容易导致数据不一致性,因此在数据更新和维护时需要格外注意数据的一致性。

充分利用 MySQL 的 JSON 函数

MySQL 提供了一系列的 JSON 函数,能够提高对 JSON 类型字段的查询速度。在实际应用中,应该充分利用这些函数,并根据需求选择不同的函数进行操作和处理。

标签: #mysql查看字段数据类型 #mysql上传文件数据类型 #mysql字段类型set #mysql修改表字段类型 #mysql存储数组的字段类型