MySQL 5.7 使用原生JSON类型
首先回顾一下JSON的语法规则:
数据在键值对中,
数据由逗号分隔,
花括号保存对象,
方括号保存数组。
按照最简单的形式,可以用下面的JSON表示:
{"NAME": "Brett", "email": "brett@xxx.com"}
如何在MySQL中使用JSON类型:
新建user表,设置lastlogininfo列为JSON类型。
mysql> CREATE TABLE user(id INT PRIMARY KEY, name VARCHAR(20) , lastlogininfo JSON);
Query OK, 0 rows affected (0.27 sec)
向user表插入普通数据与json数据。mysql会对插入的数据进行JSON格式检查,确保其符合JSON格式,若插的是不合法的数据,会出现Invalid JSON text错误。
mysql> INSERT INTO user VALUES(1 ,"lucy",'{"time":"2015-01-01 13:00:00","ip":"
192.168.1.1","result":"fail"}');
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO user VALUES(2 ,"bobo",'{"time":"2015-10-07 06:44:00","ip":"
192.168.1.0","result":"success"}');
Query OK, 1 row affected (0.04 sec)
也可以使用JSON_OBJECT()函数:
mysql> INSERT INTO user VALUES(1 ,"lucy",JSON_OBJECT("time",NOW(),"ip","
192.168.1.1","result","fail"));
Query OK, 1 row affected (0.00 sec)
查询name为'lucy'的最后登陆信息。
mysql> SELECT lastlogininfo FROM user WHERE name = 'lucy';
+------------------------------------------------------------------------+
| lastlogininfo |
+------------------------------------------------------------------------+
| {"ip": "192.168.1.1", "time": "2015-01-01 13:00:00", "result": "fail"} |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)
查询最后登陆时间在2015-10-02后的用户。JSON数据使用->操作符,其表达式为:该json列->'$.键'与JSON_EXTRACT(json列 , '$.键')等效使用。如果传入的不是一个有效的键,则返回Empty set。该表达式可以用于SELECT查询列表 ,WHERE/HAVING , ORDER/GROUP BY中,但它不能用于设置值。
表达式 : json列->'$.键'
mysql> SELECT * FROM user WHERE lastlogininfo ->'$.time' > '2015-10-02';
+-----------------------------------------------------------------------+
| id | name | lastlogininfo|
+-----------------------------------------------------------------------+
| 2 | bobo | {"ip": "192.168.1.0", "time": "2015-10-07 06:44:00", "result": "success"} |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)
等价于 :JSON_EXTRACT(json列 , '$.键')
mysql> SELECT * FROM user WHERE JSON_EXTRACT(lastlogininfo,'$.time') > '2015-10-02';
+-----------------------------------------------------------------------+
| id | name | lastlogininfo|
+-----------------------------------------------------------------------+
| 2 | bobo | {"ip": "192.168.1.0", "time": "2015-10-07 06:44:00", "result": "success"} |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)
比较JSON值采用两个级别。第一级是基于JSON类型的比较。如果类型不同,则取决于哪种类型具有更高的优先级。如果是相同的JSON类型,则是第二级,使用该类型的规则来比较。
下面的列表显示了JSON类型的比较规则,从最高优先级到最低优先级。显示在一行的类型则是具有相同的优先级。
BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
使用JSON_TYPE()函数返回指定属性对应的类型名称:
mysql> SELECT JSON_TYPE(lastlogininfo->'$.ip') FROM user;
+----------------------------------+
| JSON_TYPE(lastlogininfo->'$.ip') |
+----------------------------------+
| STRING |
| STRING |
+----------------------------------+
2 rows in set (0.00 sec)
值得一提的是,可以通过虚拟列对JSON类型的指定属性进行快速查询。
创建虚拟列:
mysql> ALTER TABLE user ADD lastloginresult VARCHAR(15)
-> GENERATED ALWAYS AS (lastlogininfo->'$.result') VIRTUAL;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
使用时和普通类型的列查询是一样的:
mysql> SELECT lastloginresult FROM user WHERE name='lucy';
+-----------------+
| lastloginresult |
+-----------------+
| "fail" |
+-----------------+
1 row in set (0.00 sec)
这只是一个简单的JSON类型例子,Mysql还提供了许多对JSON类型处理的函数,可以从MySQL的官方网站查看帮助文档:
http://dev.mysql.com/doc/refman/5.7/en/json.html
MySQL 5.7 使用原生JSON类型的更多相关文章
- MySQL 5.7的原生JSON数据类型使用
新增测试用表: CREATE TABLE lnmp ( `id` ) unsigned NOT NULL AUTO_INCREMENT, `category` JSON, `tags` JSON, P ...
- mysql中生成列与JSON类型的索引
MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, ...
- #MySQL 5.7.8 支持Json类型
As of MySQL 5.7.8, MySQL supports a native JSON data type that enables efficient access to data in J ...
- MySQL 5.7原生JSON格式支持
在MySQL与PostgreSQL的对比中,PG的JSON格式支持优势总是不断被拿来比较.其实早先MariaDB也有对非结构化的数据进行存储的方案,称为dynamic column,但是方案是通过BL ...
- mysql 5.7 laravel json类型数据相关操作
2018年10月16日18:14:21 官方文档中文翻译版 原文:https://dev.mysql.com/doc/refman/5.7/en/json.html 最后有部分实例和一个小总结 11. ...
- 【mysql】字段支持JSON类型
mysql从5.7开始已经支持JSON类型的字段. 支持的操作:添加,修改,置空,子key添加,子key重置,子key删除,通过子key查找等. 但是这里和普通字段的修改和查找不同,涉及到一些JSON ...
- 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法
---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...
- MySQL JSON 类型数据操作
1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...
- MySQL json 类型操作快速入门
MySQL 5.7.8开始支持 json类型. create table t(id int,js json,PRIMARY KEY (`id`)) 插入数据insert into t values(1 ...
随机推荐
- 关于QT_Creator不能在线调试问题
电脑:W7+64位,QT:5_7_0(vs2015版本) 用QTcreator进行在线调试时出现找不到“engine...”,原因是没有在线调试软件 CDB下载地址:http://msdn.micro ...
- android_自定义布局例子
为什么要写自定义布局: 1.在实现大量重复的子按键或者子布局时,如果一个一个去复写工作量庞大,就需要创建自定义布局直接导入布局里,可以节省大量的时间 创建自定义布局的步骤: 1.编写一个自定义xml布 ...
- http://www.cnblogs.com/hanshuhe/archive/2012/08/30/vss.html
http://www.cnblogs.com/hanshuhe/archive/2012/08/30/vss.html
- Flex+BlazeDS+java通信详细笔记
整了很长时间的通信,还是一直有一点问题.现在搞定了,记录一下,也跟有需求的同学们共享. 我重新把所有的过程再做一遍. 1新建Flex+BlazeDS+JAVA项目 右键.新建Flex项目 其中blaz ...
- javascript select标签的操作
用原生的方法对select标签的增删操作 1.选中某一个option,一般采用 option[i].selected = true 2.添加option首先需要创建一个option的节点,然后插入到 ...
- leetcode984
public class Solution { private string M1(int A, int B) { StringBuilder sb = new StringBuilder(); ; ...
- MBR (主引导记录)
概念 主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码.它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别.分区引导信息的定位,它由磁盘操 ...
- go遍历某个文件夹
//遍历文件夹 dir, err := ioutil.ReadDir("./upload_tmp")for _,file := range dir{ logs.Debug(file ...
- vue ...mapMutations 的第一个参数默认为 数据对象state
1.实现回调后 路由的跳转 mutationsLoginHeaderBackFun(state,$router) { console.log(state); console.log($router); ...
- win10家庭版升级专业版的两种方法和密钥
win10家庭版升级专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T4N7JM-CV98F-WY9XX-9D8CF-369TT FMPND-XFTD4-67FJC-HDR8C-3 ...