天天看點

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,如需轉載請自行聯系原作者

繼續閱讀