专栏首页后端技术探索mysql5.7强势支持原生json格式!!全面掌握

mysql5.7强势支持原生json格式!!全面掌握

mysql一直是如此优秀,但是随着最近一些nosql的强劲发展,甚为关系型数据库的mysql,也不例外在某些层面稍有逊色。其中,是否支持json格式是最常被用来比较的。

终于mysql5.7.7+版本,innodb引擎也可以支持原生Json了,而且不是粗略支持,是全面强大的支持,各种json处理函数满足你所有对json操作的场景。它不是简单的类似BLOB的替换,它不是以字符串格式存储,而是以内部的二进制格式存储,这样支持可以快速访问json数据;并且在创建时会自动校验是否合法json格式;而且这种原生的json type可以进行 =, <, <=, >, >=, <>, !=, 和 <=> 运算符的比较。

我们来通过实例来认识它,对它所提供的功能有个全面的了解。

首先你要升级你的mysql版本到5.7的最新GA版,升级方法可以参考本公众号的上一篇文章(关注公众号可获取)。

1.新建数据表

# 新建test1表

create table test_57.test1 (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',

`info` JSON NULL,

primary key (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试5.7版本json格式';


2.插入json数据

#insert into test_57.test1 (info) values('{"name":"yuhaiwei","age":18,"hobby":"swim,reading,writting"}');

#insert into test_57.test1 (info) values('{"name":"tangwei","age":28,"hobby":"show,song,movie"}');


3.json 函数详解

#json_array 数组json串

#insert into test57.test1 (info) values (json_array('"testname', 99, 'basketball'));


#json_object 对象json串

#insert into test_57.test1 (info) values (json_object('name','"json_object_test_name"', 'age',99, 'hobby','basketball'));


#JSON_MERGE(json_doc, json_doc[, json_doc] ...) 合并json

select json_merge('[{"name":"yhw"},{"name":"test"}]', '{"name":"test1"}');


#json_type 判断json类型,是数组还是对象

select json_type(info) from test_57.test1;


#JSON_VALID(val) 判断是否合法json

select info,json_valid(info) from test_57.test1;


#json_quote  用双引号括起来,并对json中的一些特殊字符转义

insert into test_57.test1 (info) values((('{"name":"noquote_name","age":18,"hobby":"swim,reading,writting"}')));


#JSON_UNQUOTE(val) 和 json_quote相反

#JSON_EXTRACT(json_doc, path[, path] ...) 查询出json的属性值 $-整个json,$[0]-json数组第一个元素,$.name-json的name属性值

select info,json_extract(info, '$.name') from test_57.test1;


# ->符号 ,作用等同于 json_extract

select info->'$.name' from test_57.test1 limit 1;


# JSON_SET(json_doc, path, val[, path, val] ...) 替换json串中的值, 有新属性值会添加

select json_set(info, '$.name', 'yuhaiweiset', '$.age', 11, '$.key1', 'value1') from test_57.test1 limit 1;

# json_insert 添加值(不替换),用法同json_set

# json_replace 替换值 (不添加),用法同json_set


# json_remove 删除

select json_remove(info, '$.name', '$.age', '$.name') from test_57.test1 limit 1;


#JSON_CONTAINS(json_doc, val[, path]) json_doc的path值 是否包含val

SELECT JSON_CONTAINS('{"a": 1, "b": 2, "c": {"d": 4}}', '{"d": 4}', '$.c'); #结果 1


#JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...) json_doc是否包含路径path,第二个参数为one 只要包含一个就返回true

SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';

SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e'); #结果 1

SELECt JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e'); #结果 0


#json_keys(json,[,path]) json的path路径的所有属性名

SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}', '$.b'); #结果["c"]


#JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...]) 返回search_str在json_doc的path路径下的全路径

SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';

SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]'); #结果 "$[2].x"


#JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...) 在最后添加子节点

SELECT JSON_ARRAY_APPEND('{"a": 1, "b": [2, 3], "c": 4}', '$.b[0]', 'y'); # 结果{"a": 1, "b": [[2, "y"], 3], "c": 4}


#JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...) 在前面添加兄弟节点

SELECT JSON_ARRAY_INSERT('{"a": 1, "b": [2, 3], "c": 4}', '$.b[0]', 'y'); # 结果{"a": 1, "b": ["y", 2, 3], "c": 4}


#JSON_DEPTH(json_doc) json深度

SELECT JSON_DEPTH('{}'), JSON_DEPTH('[]'), JSON_DEPTH('true'), JSON_DEPTH('[10, 20]'), JSON_DEPTH('[[], {}]'); #结果:1 1 1 2 2


#JSON_LENGTH(json_doc[, path]) json的长度,不包括嵌套的子元素的长度

SELECT JSON_LENGTH('[1, 2, {"a": 3}]'); #结果:3

SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b') #结果 1

本文分享自微信公众号 - nginx(nginx-study)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-11-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2018互联网人恋爱调查报告出炉,程序员恋爱比例居然最高

    此份报告是在今年11.11期间,以调查问卷和随机抽样的方式,对西二旗地铁站周边的互联网行业非单身人士进行了调查。(据说有一半的问卷因为填写“单身”而作废)

    后端技术探索
  • 常用nginx配置项详解(一个简单的例子)

    核心提示:Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器...

    后端技术探索
  • http response code 301 和 302,你懂吗

    一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Per...

    后端技术探索
  • Python-数据解析-json模块

    其中 loads() 和 load() 方法用于 python 对象的反序列化,dumps() 和 dump() 方法用于 python 对象的序列化。

    小团子
  • 3分钟短文 | PHP咋判断字符串是标准JSON?这样写很高效

    在MYSQL 5.6及以下没有 JSON 这个字段类型的时候,我们还只能用字符串存储数组,对象,这些结构数据;甚至有直接将序列化的对象存库的,都是无奈之举。

    程序员小助手
  • oracle mysql5.7 Json函数

    oracle mysql 5.7.8 之后增加了对json数据格式的函数处理,可更加灵活的在数据库中操作json数据,如可变属性、自定义表单等等都使用使用该方式...

    兜兜毛毛
  • json格式介绍

    json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于java...

    Devops海洋的渔夫
  • 干货 | 如何利用Python处理JSON格式的数据,建议收藏!!!

    JSON数据格式在我们的日常工作中经常会接触到,无论是做爬虫开发还是一般的数据分析处理,今天,小编就来分享一下当数据接口是JSON格式时,如何进行数据处理进行详...

    用户6888863
  • json字符串和字典的区别

    json字符串和字典的区别: json: (JavaScript Object Notation)的首字母缩写,字面的意思是(javascript对象表示法...

    武军超
  • python解析与组装json

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3...

    py3study

扫码关注云+社区

领取腾讯云代金券