MySQL5.7 新特性之JSON類型


隨着NOSQL數據庫的廣泛應用,可擴展的存儲方式在關系型數據庫中也有了很好的支持,MySQL5.7中就新增加了一個數據類型:JSON

 

JSON數據類型意義

其實,沒有JSON數據類型的支持,我們一樣可以通過varchar類型或者text等類型來保存這一格式的數據,但是,為什么還要專門增加這一數據格式的支持呢?其中肯定有較varchar或者text來存儲此類型更優越的地方。

  • 保證了JSON數據類型的強校驗,JSON數據列會自動校驗存入此列的內容是否符合JSON格式,非正常格式則報錯,而varchar類型和text等類型本身是不存在這種機制的。
  • MySQL同時提供了一組操作JSON類型數據的內置函數
  • 更優化的存儲格式,存儲在JSON列中的JSON數據會被轉成內部特定的存儲格式,允許快速讀取
  • 可以基於JSON格式的特征支持修改特定的鍵值。(即不需要把整條內容拿出來放到程序中遍歷然后尋找替換再塞回去,MySQL內置的函數允許你通過一條SQL語句就能搞定)

 

1、新增JSON類型

CREATE TABLE `user_copy` (
  `id` int(11) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `lastlogininfo` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS=1;

 

 

2、創建JSON值

mysql> INSERT INTO t_json VALUES(JSON_ARRAY('json_array'));
Query OK, 1 row affected (0.19 sec)

mysql> INSERT INTO t_json VALUES(JSON_OBJECT('key','hello'));
Query OK, 1 row affected (0.09 sec)

mysql> INSERT INTO t_json VALUES(JSON_MERGE_PRESERVE(JSON_OBJECT('key','hello'),JSON_ARRAY(1,2)));
Query OK, 1 row affected (0.14 sec)

mysql> SELECT * FROM t_json;
+--------------------------------------+
| jdoc                                 |
+--------------------------------------+
| [1, 2]                               |
| {"key1": "value1", "key2": "value2"} |
| "HELLO"                              |
| ["json_array"]                       |
| {"key": "hello"}                     |
| [{"key": "hello"}, 1, 2]             |
+--------------------------------------+
6 rows in set (0.00 sec)

 

3、搜索和修改JSON值

路徑語法

  • .keyName:JSON對象中鍵名為keyName的值;
  • 對於不合法的鍵名(如有空格),在路徑引用中必須用雙引號"將鍵名括起來,例."key name"
  • [index]:JSON數組中索引為index的值,JSON數組的索引同樣從0開始;
  • [index1 to index2]:JSON數組中從index1index2的值的集合;
  • .*: JSON對象中的所有value
  • [*]: JSON數組中的所有值;
  • prefix**suffix: 以prefix開頭並以suffix結尾的路徑;
  • **.keyName為多個路徑,如對於JSON對象'{"a": {"b": 1}, "c": {"b": 2}}','$**.b'指路徑$.a.b$.c.b
  • 不存在的路徑返回結果為NULL;
  • 前導$字符表示當前正在使用的JSON文檔;
  • 例子:對於數組[3, {"a": [5, 6], "b": 10}, [99, 100]]
    • $[1]{"a": [5, 6], "b": 10}
    • [1].a[5, 6]
    • $[1].a[1]6
    • $[1].b10
    • $[2][0]99
3.1 搜索
  • JSON對象
    mysql> SELECT JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.name');
    +--------------------------------------------------------+
    | JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.name') |
    +--------------------------------------------------------+
    | "Taylor"                                               |
    +--------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.*');
    +-----------------------------------------------------+
    | JSON_EXTRACT('{"id": 29, "name": "Taylor"}', '$.*') |
    +-----------------------------------------------------+
    | [29, "Taylor"]                                      |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)

     

  • JSON數組
    mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[1]');
    +-----------------------------------------+
    | JSON_EXTRACT('["a", "b", "c"]', '$[1]') |
    +-----------------------------------------+
    | "b"                                     |
    +-----------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[1 to 2]');
    +----------------------------------------------+
    | JSON_EXTRACT('["a", "b", "c"]', '$[1 to 2]') |
    +----------------------------------------------+
    | ["b", "c"]                                   |
    +----------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT JSON_EXTRACT('["a", "b", "c"]', '$[*]');
    +-----------------------------------------+
    | JSON_EXTRACT('["a", "b", "c"]', '$[*]') |
    +-----------------------------------------+
    | ["a", "b", "c"]                         |
    +-----------------------------------------+
    1 row in set (0.00 sec)

     

3.2 修改
  • JSON_REPLACEJSON_SET的區別
    // 舊值存在
    mysql> SELECT JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.name', 'Mere');
    +----------------------------------------------------------------+
    | JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.name', 'Mere') |
    +----------------------------------------------------------------+
    | {"id": 29, "name": "Mere"}                                     |
    +----------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT JSON_SET('{"id": 29, "name": "Taylor"}', '$.name', "Mere");
    +------------------------------------------------------------+
    | JSON_SET('{"id": 29, "name": "Taylor"}', '$.name', 'Mere') |
    +------------------------------------------------------------+
    | {"id": 29, "name": "Mere"}                                 |
    +------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    // 舊值不存在
    mysql> SELECT JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere');
    +---------------------------------------------------------------+
    | JSON_REPLACE('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere') |
    +---------------------------------------------------------------+
    | {"id": 29, "name": "Taylor"}                                  |
    +---------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT JSON_SET('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere');
    +-----------------------------------------------------------+
    | JSON_SET('{"id": 29, "name": "Taylor"}', '$.cat', 'Mere') |
    +-----------------------------------------------------------+
    | {"id": 29, "cat": "Mere", "name": "Taylor"}               |
    +-----------------------------------------------------------+
    1 row in set (0.00 sec)

     

  • JSON_INSERTJSON_SET的區別
    // 舊值存在
    mysql> SELECT JSON_INSERT('[1, 2, 3]', '$[1]', 4);
    +-------------------------------------+
    | JSON_INSERT('[1, 2, 3]', '$[1]', 4) |
    +-------------------------------------+
    | [1, 2, 3]                           |
    +-------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT JSON_SET('[1, 2, 3]', '$[1]', 4);
    +----------------------------------+
    | JSON_SET('[1, 2, 3]', '$[1]', 4) |
    +----------------------------------+
    | [1, 4, 3]                        |
    +----------------------------------+
    1 row in set (0.00 sec)
    
    //舊值不存在
    mysql> SELECT JSON_INSERT('[1, 2, 3]', '$[4]', 4);
    +-------------------------------------+
    | JSON_INSERT('[1, 2, 3]', '$[4]', 4) |
    +-------------------------------------+
    | [1, 2, 3, 4]                        |
    +-------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT JSON_SET('[1, 2, 3]', '$[4]', 4);
    +----------------------------------+
    | JSON_SET('[1, 2, 3]', '$[4]', 4) |
    +----------------------------------+
    | [1, 2, 3, 4]                     |
    +----------------------------------+
    1 row in set (0.00 sec)

     




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM