MYSQL中的JSON类型

JSON是mysql5.7新增的数据类型,打破了我对mysql数据存储的概念,在列中还能存储结构化的数据。

官方文档是很好理解的学习资源。

JSON类型格式,虽然插入的时候我们可以用字符串表示插入,但是mysql内部会被识别为json格式,也有一系列特殊处理方法。

在这之前,对mysql处理json数据的path类型的参数需要有个了解

  • ‘$‘这个代表json对象本身
  • ‘$.a‘代表json对象的key为a的对象
  • ‘$[0]‘,json对象是个数组时,为数组的第一个元素

当然表达式可以串联,如‘$.a[0]‘,代表

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

中的1数字。

创建

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

mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
+---------------------------------------------+
| JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()) |
+---------------------------------------------+
| [1, "abc", null, true, "11:30:24.000000"]   |
+---------------------------------------------+

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

mysql> SELECT JSON_OBJECT(‘id‘, 87, ‘name‘, ‘carrot‘);
+-----------------------------------------+
| JSON_OBJECT(‘id‘, 87, ‘name‘, ‘carrot‘) |
+-----------------------------------------+
| {"id": 87, "name": "carrot"}            |
+-----------------------------------------+

字符串

直接使用字符串插入数据库中,我发现也是可以的,mysql可以识别。

比如表json_test中jdata字段如果为JSON格式,则:

insert into json_test (jdata) values ( ‘{"a": 1, "b": 2, "c": {"d": 4}}‘);

也能插入有效json

JSON_QUOTE(string)

mysql> SELECT JSON_QUOTE(‘null‘), JSON_QUOTE(‘"null"‘);
+--------------------+----------------------+
| JSON_QUOTE(‘null‘) | JSON_QUOTE(‘"null"‘) |
+--------------------+----------------------+
| "null"             | "\"null\""           |

被quote后的字符串,似乎能作为合法的json对象直接写入

查询

mysql有一些在json中查找的函数,select中使用比较方便

JSON_CONTAINS(target, candidate[, path])

返回1或0是否找到

mysql> SET @j = ‘{"a": 1, "b": 2, "c": {"d": 4}}‘;
mysql> SET @j2 = ‘1‘;
mysql> SELECT JSON_CONTAINS(@j, @j2, ‘$.a‘);
+-------------------------------+
| JSON_CONTAINS(@j, @j2, ‘$.a‘) |
+-------------------------------+
|                             1 |
+-------------------------------+
mysql> SELECT JSON_CONTAINS(@j, @j2, ‘$.b‘);
+-------------------------------+
| JSON_CONTAINS(@j, @j2, ‘$.b‘) |
+-------------------------------+
|                             0 |
+-------------------------------+

这里的path变量,就是json中的路径表示。

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

从json中选组部分内容,可以简写为->操作。

mysql> SELECT c, JSON_EXTRACT(c, "$.id"), g
     > FROM jemp
     > WHERE JSON_EXTRACT(c, "$.id") > 1
     > ORDER BY JSON_EXTRACT(c, "$.name");
+-------------------------------+-----------+------+
| c                             | c->"$.id" | g    |
+-------------------------------+-----------+------+
| {"id": "3", "name": "Barney"} | "3"       |    3 |
| {"id": "4", "name": "Betty"}  | "4"       |    4 |
| {"id": "2", "name": "Wilma"}  | "2"       |    2 |
+-------------------------------+-----------+------+
3 rows in set (0.00 sec)

mysql> SELECT c, c->"$.id", g
     > FROM jemp
     > WHERE c->"$.id" > 1
     > ORDER BY c->"$.name";
+-------------------------------+-----------+------+
| c                             | c->"$.id" | g    |
+-------------------------------+-----------+------+
| {"id": "3", "name": "Barney"} | "3"       |    3 |
| {"id": "4", "name": "Betty"}  | "4"       |    4 |
| {"id": "2", "name": "Wilma"}  | "2"       |    2 |
+-------------------------------+-----------+------+
3 rows in set (0.00 sec)

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‘);
+-------------------------------+
| JSON_SEARCH(@j, ‘one‘, ‘abc‘) |
+-------------------------------+
| "$[0]"                        |
+-------------------------------+

JSON_KEYS(json_doc[, path])

mysql> SELECT JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘);
+---------------------------------------+
| JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘) |
+---------------------------------------+
| ["a", "b"]                            |
+---------------------------------------+
mysql> SELECT JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘, ‘$.b‘);
+----------------------------------------------+
| JSON_KEYS(‘{"a": 1, "b": {"c": 30}}‘, ‘$.b‘) |
+----------------------------------------------+
| ["c"]                                        |
+----------------------------------------------+

修改

  • JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
  • JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
  • JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)
  • JSON_REMOVE(json_doc, path[, path] ...)
  • JSON_REPLACE(json_doc, path, val[, path, val] ...)
  • JSON_SET(json_doc, path, val[, path, val] ...)
  • JSON_UNQUOTE(json_val)

JSON元数据相关操作

  • JSON_DEPTH(json_doc) - 深度,空对象为0
  • ON_LENGTH(json_doc[, path]) - 这个不是返回占用的空间,而是比如对于数组,返回json数组有几个元素
  • JSON_TYPE(json_val) - OBJECT,ARRAY, INTEGER, DATETIME
  • JSON_VALID(val) - 字符串是否为合法JSON对象

原文地址:https://www.cnblogs.com/mosakashaka/p/12609121.html

时间: 2024-10-05 23:54:08

MYSQL中的JSON类型的相关文章

MySQL中的string类型

转自:http://computer.uoh.edu.cn/mysql/1677.html MYSQL中STRING支持类型有:CHAR.VARCHAR.TINYTEXT.TEXT.MEDIUMTEXT.LONGTEXT.BINARY.VARBINARY.TINYBLOG.MEDIUMBLOG.BLOG.LONGBLOG.ENUM.SET类型. 这些类型对应长度(值域范围)如下: CHAR和VARCHAR——CHAR长度为0-255字符,实际保存时,不足部分填0保存.VARCHAR长度为0-65

MySQL 中 的 bit 类型,tinyint(1);

之前一直以为 mysql中没有 bit类型,需要使用 tinyint 来标识 bit.但是前端的实体类,不好控制,后来发现这些问题已经有了默认的统一设置,这样反而更好. 总结:MySQL中 使用布尔类型的字段,就用 tinyint(1),true 为1 false 为0 辅助参考文章:https://blog.csdn.net/dianjun2454/article/details/101950943 原文地址:https://www.cnblogs.com/del88/p/12538470.h

使用Python向MySQL数据库中存入json类型数据

0.说明 因为出于个人项目的需要,获取到的数据都是json类型的,并且都要存入MySQL数据库中,因为json类型数据不像一般的文本数据,所以在存入MySQL时需要注意的问题很多. 在网上找了很多方法,整理了一下比较实用可靠的,总结下来就是下面的过程: MySQL表中需要保证存储json数据的列类型为BLOB: 使用sql语句时,使用MySQLdb.excape_string函数来对json数据进行转义: 查询数据时,将结果使用json.loads就能够得到原来的Python数据类型: 下面就来

MySQL中的JSON

MySQL 5.7.7开始,支持了JSON类型. CREATE TABLE IF NOT EXISTS `spss`.`variable` (   `name` VARCHAR(512) NOT NULL,   `type` JSON NOT NULL,   `width` INT NOT NULL,   `decimals` INT NOT NULL,   `label` VARCHAR(512) NOT NULL,   `values` JSON NOT NULL,   `missing` 

MySQL 中的数字类型

MySQL 中数据类型常用的就三大类: 数字类型/numeric types 日期和时间/date and time types 字符类型/string (character and byte) types 另外还包含两个没那么常用的大类: 特殊类型/spatial types JSON 继续之前,先来看一些单位上的约定和概念, M:根据具体不同的类型,其表示的意思不一样,见下方关于这个参数的讨论. D 用于定点及浮点数,表示小数点后有多少位.最大可能取值为 30,但不应该超过 M-2. fsp

mybatis存取mysql中的json

mysql 5.7后新增了一个json类型字段,以往json入库都是转字符串,取到前端造成了不少困扰.今天就做了个小例子把这个整合到ssm例子中. 这里插句题外话,因为最近开始改用idea,配置项目的时候出了一大堆问题,这边也顺便说下如果idea在启动tomcat客户端控制台出现乱码处理办法 打开idea安装目录-bin用记事本打开idea.exe.vmoptions和idea64.exe.vmoptions文件在文件后面添加一行:-Dfile.encoding=UTF-8 好了进入整体 第一步

MySql中的时间类型datetime,timestamp,date,year比较

MySQL日期类型.日期格式.存储空间.日期范围比较.日期类型        存储空间       日期格式                 日期范围------------ ---------   --------------------- -----------------------------------------datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-31 23:59:5

关于MySQL中的varchar类型的研究

很多人讲MySQL中varchar类型的数据大小应该设置为偶数,因为一个中文占用两个字节.今天我们来测试一下varchar大小是字符还是字节,使用工具:Navicat: 1.首先创建一个t_test表,里面只有一个字段test,将其设置为varchar(1) 2.向表中添加分别添加两个数据"1"和"天" 3.测试结果:varchar()里面输入的大小代表的是字符,为了验证测试的可靠性,添加两个字符报错图片: 原文地址:https://www.cnblogs.com/

mysql中的字符串类型数据索引优化

摘自 "高性能mysql" 对于一些字符串类型较长的字段搜索时, 可以参考如下方法