天天看点

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 对象

<code>mysql&gt; SELECT JSON_OBJECT(</code><code>'k1'</code><code>, </code><code>'v1'</code><code>, </code><code>'k2'</code><code>, </code><code>'v2'</code><code>);</code>

<code>+-------------------------------------+</code>

<code>| JSON_OBJECT(</code><code>'k1'</code><code>, </code><code>'v1'</code><code>, </code><code>'k2'</code><code>, </code><code>'v2'</code><code>) |</code>

<code>| {</code><code>"k1"</code><code>: </code><code>"v1"</code><code>, </code><code>"k2"</code><code>: </code><code>"v2"</code><code>}            |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.01 sec)</code>

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

<code>mysql&gt; SELECT JSON_ARRAY(</code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>'c'</code><code>, </code><code>'d'</code><code>);</code>

<code>+--------------------------------+</code>

<code>| JSON_ARRAY(</code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>'c'</code><code>, </code><code>'d'</code><code>) |</code>

<code>| [</code><code>"a"</code><code>, </code><code>"b"</code><code>, </code><code>"c"</code><code>, </code><code>"d"</code><code>]           |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

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

<code>mysql&gt;  SELECT JSON_TYPE(</code><code>'"lisea"'</code><code>);</code>

<code>+----------------------+</code>

<code>| JSON_TYPE(</code><code>'"lisea"'</code><code>) |</code>

<code>| STRING               |</code>

<code>mysql&gt; SELECT JSON_TYPE(</code><code>'["a", "b", 1]'</code><code>);</code>

<code>+----------------------------+</code>

<code>| JSON_TYPE(</code><code>'["a", "b", 1]'</code><code>) |</code>

<code>| ARRAY                      |</code>

<code>mysql&gt; SELECT JSON_TYPE(</code><code>'1'</code><code>);</code>

<code>+----------------+</code>

<code>| JSON_TYPE(</code><code>'1'</code><code>) |</code>

<code>| INTEGER        |</code>

<code>mysql&gt; SELECT JSON_TYPE(</code><code>'{"k1":"v1", "k2":"v2"}'</code><code>);</code>

<code>| JSON_TYPE(</code><code>'{"k1":"v1", "k2":"v2"}'</code><code>) |</code>

<code>| OBJECT                              |</code>

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

<code>mysql&gt; SELECT JSON_MERGE(</code><code>'{"k1":"v1"}'</code><code>,</code><code>'{ "k2":"v2"}'</code><code>);</code>

<code>+------------------------------------------+</code>

<code>| JSON_MERGE(</code><code>'{"k1":"v1"}'</code><code>,</code><code>'{ "k2":"v2"}'</code><code>) |</code>

<code>| {</code><code>"k1"</code><code>: </code><code>"v1"</code><code>, </code><code>"k2"</code><code>: </code><code>"v2"</code><code>}                 |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.04 sec)</code>

<code>mysql&gt; SELECT JSON_MERGE(</code><code>'["k1","k2"]'</code><code>,</code><code>'{ "k3":"v3"}'</code><code>);</code>

<code>| JSON_MERGE(</code><code>'["k1","k2"]'</code><code>,</code><code>'{ "k3":"v3"}'</code><code>) |</code>

<code>| [</code><code>"k1"</code><code>, </code><code>"k2"</code><code>, {</code><code>"k3"</code><code>: </code><code>"v3"</code><code>}]               |</code>

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

<code>mysql&gt; SELECT JSON_EXTRACT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>);</code>

<code>+-----------------------------------------------+</code>

<code>| JSON_EXTRACT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>) |</code>

<code>| </code><code>"v1"</code>                                          <code>|</code>

<code>mysql&gt; SELECT JSON_EXTRACT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.*'</code><code>);</code>

<code>+----------------------------------------------+</code>

<code>| JSON_EXTRACT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.*'</code><code>) |</code>

<code>| [</code><code>"v1"</code><code>, </code><code>"v2"</code><code>]                                 |</code>

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

<code>mysql&gt; SELECT JSON_SET(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>, </code><code>'lisea'</code><code>, </code><code>'$.k2'</code><code>, </code><code>'hello'</code><code>);</code>

<code>+---------------------------------------------------------------------+</code>

<code>| JSON_SET(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>, </code><code>'lisea'</code><code>, </code><code>'$.k2'</code><code>, </code><code>'hello'</code><code>) |</code>

<code>| {</code><code>"k1"</code><code>: </code><code>"lisea"</code><code>, </code><code>"k2"</code><code>: </code><code>"hello"</code><code>}                                      |</code>

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

<code>mysql&gt; SELECT JSON_INSERT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>, </code><code>'hello'</code><code>);</code>

<code>+-------------------------------------------------------+</code>

<code>| JSON_INSERT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>, </code><code>'hello'</code><code>) |</code>

<code>| {</code><code>"k1"</code><code>: </code><code>"v1"</code><code>, </code><code>"k2"</code><code>: </code><code>"v2"</code><code>}                              |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.03 sec)</code>

<code>mysql&gt; SELECT JSON_INSERT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k3'</code><code>, </code><code>'v3'</code><code>);</code>

<code>+----------------------------------------------------+</code>

<code>| JSON_INSERT(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k3'</code><code>, </code><code>'v3'</code><code>) |</code>

<code>| {</code><code>"k1"</code><code>: </code><code>"v1"</code><code>, </code><code>"k2"</code><code>: </code><code>"v2"</code><code>, </code><code>"k3"</code><code>: </code><code>"v3"</code><code>}               |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.02 sec)</code>

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

<code>mysql&gt; SELECT JSON_REPLACE(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>, </code><code>'hello'</code><code>, </code><code>'$.k3'</code><code>, </code><code>'v3'</code><code>);</code>

<code>+----------------------------------------------------------------------+</code>

<code>| JSON_REPLACE(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>, </code><code>'hello'</code><code>, </code><code>'$.k3'</code><code>, </code><code>'v3'</code><code>) |</code>

<code>| {</code><code>"k1"</code><code>: </code><code>"hello"</code><code>, </code><code>"k2"</code><code>: </code><code>"v2"</code><code>}                                          |</code>

   * JSON_REMOVE() 通过key移除

<code>mysql&gt; SELECT JSON_REMOVE(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>);</code>

<code>| JSON_REMOVE(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>, </code><code>'$.k1'</code><code>) |</code>

<code>| {</code><code>"k2"</code><code>: </code><code>"v2"</code><code>}                                 |</code>

   * JSON_KEYS() 获取所有key

<code>mysql&gt; SELECT JSON_KEYS(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>);</code>

<code>+------------------------------------+</code>

<code>| JSON_KEYS(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>) |</code>

<code>| [</code><code>"k1"</code><code>, </code><code>"k2"</code><code>]                       |</code>

   * JSON_UNQUOTE() 去掉值的引号

<code>mysql&gt; SELECT JSON_UNQUOTE(</code><code>'"hello"'</code><code>);</code>

<code>+-------------------------+</code>

<code>| JSON_UNQUOTE(</code><code>'"hello"'</code><code>) |</code>

<code>| hello                   |</code>

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

<code>mysql&gt; SELECT JSON_DEPTH(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>);</code>

<code>| JSON_DEPTH(</code><code>'{"k1":"v1","k2":"v2"}'</code><code>) |</code>

<code>|                                   2 |</code>

<code>mysql&gt; SELECT JSON_DEPTH(</code><code>'{}'</code><code>);</code>

<code>+------------------+</code>

<code>| JSON_DEPTH(</code><code>'{}'</code><code>) |</code>

<code>|                1 |</code>

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

<code>mysql&gt; SELECT JSON_VALID(</code><code>'{"k1":"v1"}'</code><code>);</code>

<code>+---------------------------+</code>

<code>| JSON_VALID(</code><code>'{"k1":"v1"}'</code><code>) |</code>

<code>|                         1 |</code>

<code>mysql&gt; SELECT JSON_VALID(</code><code>'{"k1":"v1"'</code><code>);</code>

<code>+--------------------------+</code>

<code>| JSON_VALID(</code><code>'{"k1":"v1"'</code><code>) |</code>

<code>|                        0 |</code>

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

      长度的计算规则:

            标量的长度为1

            json array的长度为元素的个数

            json object的长度为key的个数

<code>mysql&gt; SELECT JSON_LENGTH(</code><code>'[1, 2, 3]'</code><code>);</code>

<code>| JSON_LENGTH(</code><code>'[1, 2, 3]'</code><code>) |</code>

<code>|                        3 |</code>

<code>mysql&gt; SELECT JSON_LENGTH(</code><code>'{"k1":"v1", "k2":"v2"}'</code><code>);                                                            </code>

<code>+---------------------------------------+</code>

<code>| JSON_LENGTH(</code><code>'{"k1":"v1", "k2":"v2"}'</code><code>) |</code>

<code>|                                     2 |</code>

   * 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下查。

<code>mysql&gt; SELECT JSON_SEARCH(</code><code>'{"k1":"v1", "k2":"v2", "k3":"v2"}'</code><code>, </code><code>'one'</code><code>, </code><code>'v2%'</code><code>);</code>

<code>+----------------------------------------------------------------+</code>

<code>| JSON_SEARCH(</code><code>'{"k1":"v1", "k2":"v2", "k3":"v2"}'</code><code>, </code><code>'one'</code><code>, </code><code>'v2%'</code><code>) |</code>

<code>| </code><code>"$.k2"</code>                                                         <code>|</code>

<code>mysql&gt; SELECT JSON_SEARCH(</code><code>'{"k1":"v1", "k2":"v2", "k3":"v2"}'</code><code>, </code><code>'all'</code><code>, </code><code>'v2%'</code><code>);</code>

<code>| JSON_SEARCH(</code><code>'{"k1":"v1", "k2":"v2", "k3":"v2"}'</code><code>, </code><code>'all'</code><code>, </code><code>'v2%'</code><code>) |</code>

<code>| [</code><code>"$.k2"</code><code>, </code><code>"$.k3"</code><code>]                                               |</code>

4. 总结

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

      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1943339,如需转载请自行联系原作者

继续阅读