說說 MySQL JSON 數據類型

本文首發於個人微信公眾號《andyqian》,期待你的關注!

前言

今天我們來說一說,MySQL JSON數據類型,JSON我相信大家都已經很熟悉了,(Java對象與JSON互轉,可以查看《fastjson詳解》這篇文章),但在 MySQL中,直至 5.7 版本中,才正式引入 JSON數據類型。在次之前,我們通常使varchar或text數據類型存儲JSON格式數據。

如何使用JSON?

在這一章節,不再具體介紹JSON格式以及語法,我們來介紹一下,在MySQL中如何創建JSON數據列。 語法:

create table t_base_data(nid bigint(20) not null primary key auto_increment, ncontent jsonn)n

新增數據:

mysql> insert into t_base_data (content)values({"blog": "www.andyqian.com", "account": "andyqian"});nQuery OK, 1 row affected (0.01 sec)n

這裡需要注意的是:

  1. JSON列存儲的必須是JSON格式數據,否則會報錯。
  2. JSON數據類型是沒有默認值的。

Varchar VS JSON

大家都應該知道,在沒有JSON數據類型時,還不是一樣可以使用varchar類型或text類型來存儲就JSON格式的字元串,那麼,JSON格式到底哪些「過人"之處呢?好處還真不少呢。

  1. JSON數據類型,會自動校驗數據是否為JSON格式,如果不是JSON格式數據,則會報錯。
  2. MySQL提供了一組操作JSON數據的內置函數。
  3. 優化的存儲格式,存儲在JSON列中的JSON數據被轉換成內部的存儲格式。其允許快速讀取。
  4. 可以修改特定的鍵值,(如果之前在MySQL中存儲過JSON格式字元串的小夥伴,應該經歷過每次修改一個值,都要將整個JSON字元串更新一遍的尷尬。)

你看,上面這些好處,誘惑足夠大嗎?

常用JSON函數

MySQL中,給我們提供了不少JSON相關的函數,簡直讓我們愛不釋手,下面一一來介紹常用的JSON函數。

注意:以下示例MySQL版本為: 5.7.20

1. JSON_TYPE 函數

作用: 顯示當前JSON字元串的類型。

例如:

mysql> select json_type("hello");n+----------------------+n| json_type("hello") |n+----------------------+n| STRING |n+----------------------+n1 row in set (0.00 sec)n

集合類型:

mysql> select json_type(["andyqian","Java","xingming"]);n+---------------------------------------------+n| json_type(["andyqian","Java","xingming"]) |n+---------------------------------------------+n| ARRAY |n+---------------------------------------------+n1 row in set (0.00 sec)n

2. JSON_ARRAY 函數

作用: 將數組對象轉換為json數組

例如:

mysql> select json_array(1,now(),"andyqian");n+-----------------------------------------------+n| json_array(1,now(),"andyqian") |n+-----------------------------------------------+n| [1, "2017-12-07 23:05:41.000000", "andyqian"] |n+-----------------------------------------------+n1 row in set (0.00 sec)n

其中json_array參數待轉換為json的對象集合,對Java熟悉的童鞋,可以看成是集合。

3. JSON_OBJECT 函數

語法:JSON_OBJECT(key,value,key1,value1)

作用:將對象轉換為json格式數據

例如:

mysql> select json_object(name,鞠騫,account,andyqian);n+---------------------------------------------------+n| json_object(name,鞠騫,account,andyqian) |n+---------------------------------------------------+n| {"name": "鞠騫", "account": "andyqian"} |n+---------------------------------------------------+n1 row in set (0.00 sec)n

4. JSON_QUOTE 函數

作用: 引用字元串作為json值。

例如:

mysql> select json_quote("andyqian");n+--------------------------+n| json_quote("andyqian") |n+--------------------------+n| ""andyqian"" |n+--------------------------+n1 row in set (0.00 sec)n

這裡需要注意的是:

  1. 如果參數為null值,顯示也為Null值。
  2. JSON_UNQUOTE 函數與JSON_QUOTE 函數作用正好相反。

5. JSON_MERGE函數

作用: 合併JSON字元串

例如:

mysql> select json_merge({"blog":"www.andyqian.com"},{"account":"andyqian"});n+--------------------------------------------------------------------+n| json_merge({"blog":"www.andyqian.com"},{"account":"andyqian"}) |n+--------------------------------------------------------------------+n| {"blog": "www.andyqian.com", "account": "andyqian"} |n+--------------------------------------------------------------------+n1 row in set (0.00 sec)n

  1. JSON_VALID 函數

作用: 判斷JSON格式是否有效 例如:

mysql> select json_valid("andyqian"),json_valid("andyqian"),json_valid(null);n+------------------------+--------------------------+------------------+n| json_valid("andyqian") | json_valid("andyqian") | json_valid(null) |n+------------------------+--------------------------+------------------+n| 0 | 1 | NULL |n+------------------------+--------------------------+------------------+n1 row in set (0.00 sec)n

這裡需要注意的是: 0 表示無效,1 表示有效,NUll 表示參數為null。

MySQL提供了不少操作JSON數據的函數,這裡只給出一些常見的函數,更多請參考官網查看。

小結

由於上面描述了不少重要的函數,避免帶來閱讀疲勞,今天就不寫命令了。另外,今天數了數,MySQL系列文章,也有十多篇了,感覺還有不少東西,可以記錄,這個系列還會寫一段時間,在這期間,你們有想讓我分享的文章,也可以留言哦。

PS:我負責寫文章,你們幫忙點贊,留言,轉發可好?


推薦文章

寫會MySQL索引

讀懂MySQL執行計劃

談談MySQL隱式類型轉換

學會MySQL LIMIT


推薦閱讀:

有哪些面向數據分析人員的mysql書籍/教程推薦?
MySQL建立關聯表可以不創建主鍵么?

TAG:MySQL | MySQL入门 | 数据类型 |