MySQL 5.7新支持--------Json类型实战

1. 背景

  * 在MySQL 5.7.8中,MySQL支持由RFC 7159定义的本地JSON数据类型,它支持对JSON(JavaScript对象标记)文档中的数据进行有效访问.

  * MySQL会对DML JSON数据自动验证。无效的DML JSON数据操作会产生错误.

* 优化的存储格式。存储在JSON列中的JSON文档转换为一种内部格式,允许对Json元素进行快速读取访问.

* MySQL Json类型支持建立索引增加查询性能提升.

2. Json类型所需的存储空间和值范围

类型 占用字节 最大长度
Json 数据长度 + 4 bytes 4G

3. Json相关函数操作

* JSON_OBJECT(string1, string2...) 创建 key-value 类型 Json 对象

mysql> SELECT JSON_OBJECT(‘k1‘, ‘v1‘, ‘k2‘, ‘v2‘);
+-------------------------------------+
| JSON_OBJECT(‘k1‘, ‘v1‘, ‘k2‘, ‘v2‘) |
+-------------------------------------+
| {"k1": "v1", "k2": "v2"}            |
+-------------------------------------+
1 row in set (0.01 sec)

* JSON_ARRAY(string1, string2...) 创建一个 Json 数组

mysql> SELECT JSON_ARRAY(‘a‘, ‘b‘, ‘c‘, ‘d‘);
+--------------------------------+
| JSON_ARRAY(‘a‘, ‘b‘, ‘c‘, ‘d‘) |
+--------------------------------+
| ["a", "b", "c", "d"]           |
+--------------------------------+
1 row in set (0.00 sec)

* JSON_TYPE(object) 判断并显示数据类型 [ 值非法会报错显示 ]

mysql>  SELECT JSON_TYPE(‘"lisea"‘);
+----------------------+
| JSON_TYPE(‘"lisea"‘) |
+----------------------+
| STRING               |
+----------------------+
1 row in set (0.01 sec)

mysql> SELECT JSON_TYPE(‘["a", "b", 1]‘);
+----------------------------+
| JSON_TYPE(‘["a", "b", 1]‘) |
+----------------------------+
| ARRAY                      |
+----------------------------+
1 row in set (0.01 sec)

mysql> SELECT JSON_TYPE(‘1‘);
+----------------+
| JSON_TYPE(‘1‘) |
+----------------+
| INTEGER        |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_TYPE(‘{"k1":"v1", "k2":"v2"}‘);
+-------------------------------------+
| JSON_TYPE(‘{"k1":"v1", "k2":"v2"}‘) |
+-------------------------------------+
| OBJECT                              |
+-------------------------------------+
1 row in set (0.00 sec)

* JSON_MERGE(doc1,doc2....) 合并多个Json对象

mysql> SELECT JSON_MERGE(‘{"k1":"v1"}‘,‘{ "k2":"v2"}‘);
+------------------------------------------+
| JSON_MERGE(‘{"k1":"v1"}‘,‘{ "k2":"v2"}‘) |
+------------------------------------------+
| {"k1": "v1", "k2": "v2"}                 |
+------------------------------------------+
1 row in set (0.04 sec)

mysql> SELECT JSON_MERGE(‘["k1","k2"]‘,‘{ "k3":"v3"}‘);
+------------------------------------------+
| JSON_MERGE(‘["k1","k2"]‘,‘{ "k3":"v3"}‘) |
+------------------------------------------+
| ["k1", "k2", {"k3": "v3"}]               |
+------------------------------------------+
1 row in set (0.00 sec)

* JSON_EXTRACT(object, key) 通过Json key方式获取Val值

mysql> SELECT JSON_EXTRACT(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘);
+-----------------------------------------------+
| JSON_EXTRACT(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘) |
+-----------------------------------------------+
| "v1"                                          |
+-----------------------------------------------+
1 row in set (0.01 sec)

mysql> SELECT JSON_EXTRACT(‘{"k1":"v1","k2":"v2"}‘, ‘$.*‘);
+----------------------------------------------+
| JSON_EXTRACT(‘{"k1":"v1","k2":"v2"}‘, ‘$.*‘) |
+----------------------------------------------+
| ["v1", "v2"]                                 |
+----------------------------------------------+
1 row in set (0.00 sec)

* JSON_SET(object, key, val, key, val....) 通过key修改val值

mysql> SELECT JSON_SET(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘, ‘lisea‘, ‘$.k2‘, ‘hello‘);
+---------------------------------------------------------------------+
| JSON_SET(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘, ‘lisea‘, ‘$.k2‘, ‘hello‘) |
+---------------------------------------------------------------------+
| {"k1": "lisea", "k2": "hello"}                                      |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

* JSON_INSERT(object, key, val)添加新值到对象中,如果key已存在,不替换val

mysql> SELECT JSON_INSERT(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘, ‘hello‘);
+-------------------------------------------------------+
| JSON_INSERT(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘, ‘hello‘) |
+-------------------------------------------------------+
| {"k1": "v1", "k2": "v2"}                              |
+-------------------------------------------------------+
1 row in set (0.03 sec)

mysql> SELECT JSON_INSERT(‘{"k1":"v1","k2":"v2"}‘, ‘$.k3‘, ‘v3‘);
+----------------------------------------------------+
| JSON_INSERT(‘{"k1":"v1","k2":"v2"}‘, ‘$.k3‘, ‘v3‘) |
+----------------------------------------------------+
| {"k1": "v1", "k2": "v2", "k3": "v3"}               |
+----------------------------------------------------+
1 row in set (0.02 sec)

* JSON_REPLACE() 替换现有的值并忽略新的值

mysql> SELECT JSON_REPLACE(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘, ‘hello‘, ‘$.k3‘, ‘v3‘);
+----------------------------------------------------------------------+
| JSON_REPLACE(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘, ‘hello‘, ‘$.k3‘, ‘v3‘) |
+----------------------------------------------------------------------+
| {"k1": "hello", "k2": "v2"}                                          |
+----------------------------------------------------------------------+
1 row in set (0.01 sec)

* JSON_REMOVE() 通过key移除

mysql> SELECT JSON_REMOVE(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘);
+----------------------------------------------+
| JSON_REMOVE(‘{"k1":"v1","k2":"v2"}‘, ‘$.k1‘) |
+----------------------------------------------+
| {"k2": "v2"}                                 |
+----------------------------------------------+
1 row in set (0.00 sec)

* JSON_KEYS() 获取所有key

mysql> SELECT JSON_KEYS(‘{"k1":"v1","k2":"v2"}‘);
+------------------------------------+
| JSON_KEYS(‘{"k1":"v1","k2":"v2"}‘) |
+------------------------------------+
| ["k1", "k2"]                       |
+------------------------------------+
1 row in set (0.03 sec)

* JSON_UNQUOTE() 去掉值的引号

mysql> SELECT JSON_UNQUOTE(‘"hello"‘);
+-------------------------+
| JSON_UNQUOTE(‘"hello"‘) |
+-------------------------+
| hello                   |
+-------------------------+
1 row in set (0.01 sec)

* JSON_DEPTH() 获取Json对象的深度

mysql> SELECT JSON_DEPTH(‘{"k1":"v1","k2":"v2"}‘);
+-------------------------------------+
| JSON_DEPTH(‘{"k1":"v1","k2":"v2"}‘) |
+-------------------------------------+
|                                   2 |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_DEPTH(‘{}‘);
+------------------+
| JSON_DEPTH(‘{}‘) |
+------------------+
|                1 |
+------------------+
1 row in set (0.01 sec)

* JSON_VALID() 判断是否为有效的json格式

mysql> SELECT JSON_VALID(‘{"k1":"v1"}‘);
+---------------------------+
| JSON_VALID(‘{"k1":"v1"}‘) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_VALID(‘{"k1":"v1"‘);
+--------------------------+
| JSON_VALID(‘{"k1":"v1"‘) |
+--------------------------+
|                        0 |
+--------------------------+
1 row in set (0.00 sec)

* JSON_LENGTH() 获取指定路径下的长度

长度的计算规则:

标量的长度为1

json array的长度为元素的个数

json object的长度为key的个数

mysql> SELECT JSON_LENGTH(‘[1, 2, 3]‘);
+--------------------------+
| JSON_LENGTH(‘[1, 2, 3]‘) |
+--------------------------+
|                        3 |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_LENGTH(‘{"k1":"v1", "k2":"v2"}‘);                                                            
+---------------------------------------+
| JSON_LENGTH(‘{"k1":"v1", "k2":"v2"}‘) |
+---------------------------------------+
|                                     2 |
+---------------------------------------+
1 row in set (0.00 sec)

* JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

   查询包含指定字符串的paths,并作为一个json array返回 

   one_or_all:"one"表示查询到一个即返回;"all"表示查询所有。

   search_str:要查询的字符串。 可以用LIKE里的‘%‘或‘_’匹配。

   path:在指定path下查。

mysql> SELECT JSON_SEARCH(‘{"k1":"v1", "k2":"v2", "k3":"v2"}‘, ‘one‘, ‘v2%‘);
+----------------------------------------------------------------+
| JSON_SEARCH(‘{"k1":"v1", "k2":"v2", "k3":"v2"}‘, ‘one‘, ‘v2%‘) |
+----------------------------------------------------------------+
| "$.k2"                                                         |
+----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_SEARCH(‘{"k1":"v1", "k2":"v2", "k3":"v2"}‘, ‘all‘, ‘v2%‘);
+----------------------------------------------------------------+
| JSON_SEARCH(‘{"k1":"v1", "k2":"v2", "k3":"v2"}‘, ‘all‘, ‘v2%‘) |
+----------------------------------------------------------------+
| ["$.k2", "$.k3"]                                               |
+----------------------------------------------------------------+
1 row in set (0.01 sec)

4. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。

时间: 2024-08-04 10:20:56

MySQL 5.7新支持--------Json类型实战的相关文章

MySQL 5.7新支持--------Json索引创建实战

1. 背景 * 在MySQL 5.7.8中,MySQL支持由RFC 7159定义的本地JSON数据类型,它支持对JSON(JavaScript对象标记)文档中的数据进行有效访问. * MySQL会对DML JSON数据自动验证.无效的DML JSON数据操作会产生错误. * 优化的存储格式.存储在JSON列中的JSON文档转换为一种内部格式,允许对Json元素进行快速读取访问. * MySQL Json类型支持通过虚拟列方式建立索引,从而增加查询性能提升. 2. Json 索引 * 创建Json

MySQL 5.7新支持--------通用表空间实战

1. 背景 * 一个通用的表空间是一个共享的InnoDB表空间. * 与系统表空间类似,一般的表空间是共享的表空间,可以存储多个表的数据 * 一般的表空间比文件表的表空间具有潜在的内存优势. * MySQL 将表空间元数据保存到一个表空间的生命周期中.在更少的一般表空间中,多个表对表空间元数据的内存比在单独的文件表空间表空间中的相同数量的表要少. * 一般的表空间数据文件可能放在一个相对于MySQL数据目录的目录中,它为您提供了许多文件表空间的数据文件和存储管理功能.与文件表的表空间一样,在My

mysql中生成列与JSON类型的索引

MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle(sidea, sideb) VALUES(3,4),(6,8),(5,12); mysql> select * from triangle;

MySQL 5.7开始支持JSON,那还有必要使用MongoDB存JSON吗?请列出你的观点/理由。

一.观点A:支持MySQL存储JSON MongoDB不支持事务,而MySQL支持事务 MySQL相对MongoDB而言,MySQL的稳定性要优于MongoDB MySQL支持多种存储引擎 二.观点B:支持MongoDB存储JSON 从性能的角度考虑,对于JSON读写效率MongoDB要优于MySQL MongoDB相对MySQL而言,MongoDB的扩展性要优于MySQL MongoDB支持更多的JSON函数 三.总结 如果应用程序无事务要求,存储数据表结构复杂并且经常被修改, 例如游戏中装备

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

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

Mysql json类型

5.7版本支持原生json类型代替BLOB类型json数据有效性检查查询性能提升:不需要遍历所有字符串才能找到数据支持部分属性索引 1. json格式范例 2. 结构化与非结构化 结构化:二维表结构(行和列) ? 使用SQL语句进行操作非结构化:使用Key-Value格式定义数据,无结构定义 ? Value可以嵌套Key-Value格式的数据 ? 使用JSON进行实现 SQL创建User表create table user (id bigint not null auto_increment,

Mybatis和Mysql的Json类型

Mysql5.7新增加了Json类型字段,但是目前Mybatis中并不支持 1.新建MybatisJsonTypeHandler.java import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.

MySQL对JSON类型UTF-8编码导致中文乱码探讨

前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中文出现乱码还有可深挖之处,接下来我们来分析一下,若有错误之处,还请批评指出. 字符编码 评论中指出任何不在基本多文本平面的Unicode字符,都无法使用MySQL的utf8字符集存储,包括Emoji 表情(Emoji 是一种特殊的Unicode 编码,常见于IOS和Android 手机上)和很多不常

MySQL数据类型--------整数类型实战

1. 背景 * MySQL支持SQL标准整数类型整数(或INT)和SMALLINT.作为标准的扩展,MySQL还支持整数类型TINYINT.MEDIUMINT和BIGINT 2.  整数类型所需的存储和值范围 类型 占用空间 最小值 最大值 (字节) (signed/Unsigned) (signed/Unsigned) TINYINT 1 -128 127 0 255 SMALLINT 2 -32768 32767 0 65535 MEDIUMINT 3 -8388608 8388607 0