mysql存json格式数据的话,存varchar好还是text好
时间: 2023-02-08 15:09:28 浏览: 259
在 MySQL 中,当你需要存储 JSON 格式的数据时,使用 VARCHAR 或 TEXT 都是可行的。
VARCHAR 数据类型具有可变长度,其长度可以在创建表时指定。如果你知道你存储的 JSON 数据长度不会超过一个特定值,那么使用 VARCHAR 数据类型是一个好选择。
TEXT 数据类型则不同,它不需要在创建表时指定长度,能存储的长度更长,因此如果你不确定你存储的 JSON 数据长度的话,使用 TEXT 数据类型是一个较安全的选择。
另外需要注意的是, 从 MySQL 5.7.8 开始, MySQL 提供了 JSON 数据类型,如果你的 MySQL 版本大于等于 5.7.8,建议使用 JSON 数据类型。使用 JSON 数据类型存储 JSON 数据可以更好的获徖一些性能上的优势。
相关问题
数据类型是字典的话MySQL数据库中怎么设计数据字段
在MySQL数据库中,如果你需要存储类似于字典(键值对)的数据结构,通常可以考虑使用JSON类型或者自定义表结构来模拟。以下是两种常见的方法:
1. 使用JSON类型:MySQL 5.7及以上版本支持JSON数据类型,你可以创建一个包含JSON字段的列来存储字典数据。例如:
```sql
CREATE TABLE your_table (
id INT PRIMARY KEY,
data_field JSON
);
```
在这个例子中,`data_field`就是用于存储字典信息的JSON字段。
2. 自定义表结构:如果字典结构相对固定,你可以创建一张专门的表来存储键值对,每个键对应一个单独的字段,然后关联主表:
```sql
CREATE TABLE key_values (
key_column VARCHAR(255) NOT NULL,
value_column TEXT,
table_id INT,
FOREIGN KEY (table_id) REFERENCES your_table(id)
);
```
每次添加或更新字典时,只需要插入或更新`key_values`表即可。
已知表结构为:CREATE TABLE `dmp_data_verification_rule` ( `id` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键', `rule_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '规则编码', `rule_comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '规则说明', `reconfirm_flag` tinyint NOT NULL COMMENT '是否需要人为二次判断', `rule_type_id` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '规则分类id', `rule_set_ids` json DEFAULT NULL COMMENT '规则集ids,数组形式:["1"]', `rule_order` int DEFAULT NULL COMMENT '规则排序', `extra_note` json DEFAULT NULL COMMENT '备注', `creator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', `creation_time` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建时间', `modifier` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最后修改人', `modified_time` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '最后修改时间', `valid` tinyint NOT NULL COMMENT '合法标识', `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '乐观锁', PRIMARY KEY (`id`) USING BTREE, KEY `idx_type_id` (`rule_type_id`) USING BTREE COMMENT '规则类型索引', KEY `idx_rule_code` (`rule_code`) USING BTREE COMMENT '规则编码', KEY `idx_rule_order` (`rule_order`) USING BTREE COMMENT '规则排序' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据校验规则表';,extra_note 存储的数据有{"scopeCode": "project", "classCodesA": ["ACCCAC"], "classCodesB": ["ACCCCP","ACCCAC"]},怎么根据ruleTypeId,及classCodesB(数组)进行数据查询,classCodesB传的是个数组,需要判断数组中的元素是否完全相同相等,通过mysql及mapper.xml实现
可以使用MySQL的JSON_CONTAINS函数和JSON_EXTRACT函数来实现。具体的SQL语句如下:
```
SELECT * FROM dmp_data_verification_rule
WHERE rule_type_id = 'your_rule_type_id'
AND JSON_CONTAINS(extra_note->'$.classCodesB', '["ACCCCP", "ACCCAC"]') = 1;
```
这条SQL语句中,我们查询了dmp_data_verification_rule表中rule_type_id为'your_rule_type_id',且extra_note字段中的classCodesB数组完全等于["ACCCCP", "ACCCAC"]的数据。其中,JSON_CONTAINS函数用于判断extra_note中的classCodesB数组是否包含指定的数组,如果包含则返回1,否则返回0。而JSON_EXTRACT函数用于提取extra_note中的classCodesB数组。
在mapper.xml中使用该SQL语句的话,可以把SQL语句写在select元素的text属性中。例如:
```
<select id="selectByRuleTypeAndClassCodesB" resultType="YourResultType">
SELECT * FROM dmp_data_verification_rule
WHERE rule_type_id = #{ruleTypeId}
AND JSON_CONTAINS(extra_note->'$.classCodesB', #{classCodesB}) = 1;
</select>
```
其中,#{ruleTypeId}和#{classCodesB}是使用MyBatis的参数占位符。这样,在调用该方法时,只需要传入ruleTypeId和classCodesB两个参数即可。
阅读全文