1. 程式人生 > >10分鐘瞭解MySQL5.7對原生JSON的支援與用法

10分鐘瞭解MySQL5.7對原生JSON的支援與用法


Part1:JSON格式的支援

版本終於支援了原生的JSON格式,即將關係型資料庫和文件型NO_SQL資料庫集於一身。本文接下來將對這特性分別就和各自實現的方法異同進行介紹和演示。

Part2:建立相應表結構

[[email protected] ~]# mysql -V

mysql  Ver Distrib , for linux- (x86_64) using  EditLine wrapper

mysql> create database helei;
Query OK, 1 row affected ( sec)
mysql> use helei;
Database changed
mysql> create table helei (id int(10) unsigned NOT NULL,context json default null,primary key(id));
Query OK, 0 rows affected ( sec)
mysql> show create table helei \G
*************************** 1. row ***************************
       Table: helei
Create Table: CREATE TABLE `helei` (
  `id` int(10) unsigned NOT NULL,
  `context` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set ( sec)

Part3:構造資料&測試

mysql> desc helei;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| id      | int(10) unsigned | NO   | PRI | NULL    |       |
| context | json             | YES  |     | NULL    |       |
+---------+------------------+------+-----+---------+-------+
2 rows in set ( sec)

mysql> insert into helei values(1,'{"name":"賀磊","age":100}'),(2,'{"name":"陳加持","age":30}'),(3,'{"name":"於浩","age":28}');
Query OK, 3 rows affected ( sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from helei;
+----+----------------------------------+
| id | context                          |
+----+----------------------------------+
|  1 | {"age": 100, "name": "賀磊"}     |
|  2 | {"age": 30, "name": "陳加持"}    |
|  3 | {"age": 28, "name": "於浩"}      |
+----+----------------------------------+
3 rows in set ( sec)


mysql> select id,JSON_EXTRACT(context,'$.name') name,JSON_EXTRACT(context,'$.age') age from helei;
+----+-------------+------+
| id | name        | age  |
+----+-------------+------+
|  1 | "賀磊"      | 100  |
|  2 | "陳加持"    | 30   |
|  3 | "於浩"      | 28   |
+----+-------------+------+
3 rows in set ( sec)
獲取Key-Value

mysql> select id,json_keys(context) from helei;
+----+--------------------+
| id | json_keys(context) |
+----+--------------------+
|  1 | ["age", "name"]    |
|  2 | ["age", "name"]    |
|  3 | ["age", "name"]    |
+----+--------------------+
3 rows in set ( sec)
獲取全部Key

mysql> update helei set context=JSON_INSERT(context,'$.name',"賀磊",'$.address','beijing')where id=1;
Query OK, 1 row affected ( sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from helei;
+----+------------------------------------------------------+
| id | context                                              |
+----+------------------------------------------------------+
|  1 | {"age": 100, "name": "賀磊", "address": "beijing"}   |
|  2 | {"age": 30, "name": "陳加持"}                        |
|  3 | {"age": 28, "name": "於浩"}                          |
+----+------------------------------------------------------+
3 rows in set ( sec)
增加Key-Value

mysql> update helei set context=JSON_SET(context,'$.name',"高窮帥")where id=1;
Query OK, 1 row affected ( sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from helei;
+----+---------------------------------------------------------+
| id | context                                                 |
+----+---------------------------------------------------------+
|  1 | {"age": 100, "name": "高窮帥", "address": "beijing"}    |
|  2 | {"age": 30, "name": "陳加持"}                           |
|  3 | {"age": 28, "name": "於浩"}                             |
+----+---------------------------------------------------------+
3 rows in set ( sec)
變更key-value

mysql> update helei set context=JSON_REMOVE(context,'$.name') where id=1;
Query OK, 1 row affected ( sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from helei;
+----+------------------------------------+
| id | context                            |
+----+------------------------------------+
|  1 | {"age": 100, "address": "beijing"} |
|  2 | {"age": 30, "name": "陳加持"}      |
|  3 | {"age": 28, "name": "於浩"}        |
+----+------------------------------------+
3 rows in set ( sec)
刪除Key-Value

JSON格式儲存BLOB的測試

Part1:Dynamic Columns處理方式的異同

的動態列JSON格式儲存

mysql> insert into helei_blob values(1,'{"name":"賀磊","age":100}'),(2,'{"name":"陳加持","age":30}'),(3,'{"name":"於浩","age":28}');
Query OK, 3 rows affected ( sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from helei_blob;
+----+-------------------------------+
| id | blob_col                      |
+----+-------------------------------+
|  1 | {"name":"賀磊","age":100}     |
|  2 | {"name":"陳加持","age":30}    |
|  3 | {"name":"於浩","age":28}      |
+----+-------------------------------+
3 rows in set ( sec)

MariaDB的動態列JSON格式儲存

MariaDB [helei]> create table helei (id int(10) unsigned NOT NULL,context json default null,primary key(id));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'json default null,primary key(id))' at line 1
可以看到MariaDB並不能直接儲存JSON型別。

MariaDB [helei]> show create table helei_blob\G;
*************************** 1. row ***************************
       Table: helei_blob
Create Table: CREATE TABLE `helei_blob` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `blob_col` blob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set ( sec)
ERROR: No query specified

MariaDB [helei]> insert into helei_blob values(5,column_create('color','blue','size','XL'));
Query OK, 1 row affected ( sec)

MariaDB [helei]> select * from helei_blob;
+----+--------------------------------+
| id | blob_col                       |
+----+--------------------------------+
|  1 | {"name":"賀磊","age":100}      |
|  2 | {"name":"陳加持","age":30}     |
|  3 | {"name":"於浩","age":28}       |
|  5 |  	     3 sizecolor!XL!blue |
+----+--------------------------------+
4 rows in set ( sec)
直接查詢是亂碼需用以下函式查詢

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id =5;
+----+------------------------------+
| id | column_json(blob_col)        |
+----+------------------------------+
|  5 | {"size":"XL","color":"blue"} |
+----+------------------------------+
1 row in set ( sec)

MariaDB [helei]> select id,column_list(blob_col) from helei_blob where id =5;
+----+-----------------------+
| id | column_list(blob_col) |
+----+-----------------------+
|  5 | `size`,`color`        |
+----+-----------------------+
1 row in set ( sec)
獲取全部Key

MariaDB [helei]> select id,column_get(blob_col,'color' as char) as color from helei_blob where id =5;
+----+-------+
| id | color |
+----+-------+
|  5 | blue  |
+----+-------+
1 row in set ( sec)
獲取Key-Value

MariaDB [helei]> update helei_blob set blob_col=column_add(blob_col,'sex','man') where id=5;
Query OK, 1 row affected ( sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5;
+----+------------------------------------------+
| id | column_json(blob_col)                    |
+----+------------------------------------------+
|  5 | {"sex":"man","size":"XL","color":"blue"} |
+----+------------------------------------------+
1 row in set ( sec)
增加Key-Value

MariaDB [helei]> update helei_blob set blob_col=column_add(blob_col,'color','black') where id=5;
Query OK, 1 row affected ( sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5;
+----+-------------------------------------------+
| id | column_json(blob_col)                     |
+----+-------------------------------------------+
|  5 | {"sex":"man","size":"XL","color":"black"} |
+----+-------------------------------------------+
1 row in set ( sec)
更改Key-Value

MariaDB [helei]> update helei_blob set blob_col=column_delete(blob_col,'sex','man') where id=5;
Query OK, 1 row affected ( sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [helei]> select id,column_json(blob_col) from helei_blob where id=5;
+----+-------------------------------+
| id | column_json(blob_col)         |
+----+-------------------------------+
|  5 | {"size":"XL","color":"black"} |
+----+-------------------------------+
1 row in set ( sec)
刪除Key-Value

——總結——

雖然和/版本對於JSON的支援是比較完整的,不過MongoDB的Sharding功能更加好用,個人更傾向於MongoDB。由於筆者的水平有限,編寫時間也很倉促,文中難免會出現一些錯誤或者不準確的地方,不妥之處懇請讀者批評指正。

相關推薦

10分鐘瞭解MySQL5.7原生JSON支援用法

Part1:JSON格式的支援 版本終於支援了原生的JSON格式,即將關係型資料庫和文件型NO_SQL資料庫集於一身。本文接下來將對這特性分別就和各自實現的方法異同進行介紹和演示。 Part2:建立相應表結構 [[email protected] ~]# m

Mysql5.7.9原生JSON格式支援

在MySQL與PostgreSQL的對比中,PG的JSON格式支援優勢總是不斷被拿來比較。其實早先MariaDB也有對非結構化的資料進行儲存的方案,稱為dynamic column,但是方案是通過BLOB型別的方式來儲存。這樣導致的問題是查詢效能不高,不能有效建立索引,

mysql5.7新特性JSON數據類型解析

family rate fec efault idt ora 似的 create flow 廢話不多說,直接上實例。一、json結構創建測試表CREATE TABLE `article` ( `id` int(11) unsigned NOT NULL AUTO_INC

10分鐘瞭解react引入的hooks

“大家好,我是谷阿莫,今天要將的是一個...”,哈哈哈,看到這個題我就想到這個開頭。最近react 官方在 2018 ReactConf 大會上宣佈 React v16.7.0-alpha(內測) 將引入 Hooks。所以我們有必要了解 Hooks,以及由此引發的疑問。 當然,學習的最好、最

10分鐘瞭解 react 引入的 Hooks

“大家好,我是谷阿莫,今天要將的是一個...”,哈哈哈,看到這個題我就想到這個開頭。最近react 官方在 2018 ReactConf 大會上宣佈 React v16.7.0-alpha(內測) 將引入 Hooks。所以我們有必要了解 Hooks,以及由此引發的疑問。 當然,學習的最好、最直接的方法就是看

雲資料庫POLARDB優勢解讀之①——10分鐘瞭解

什麼是POLARDB POLARDB 是阿里雲自研的下一代關係型分散式資料庫,100%相容MySQL,之前使用MySQL的應用程式不需要修改一行程式碼,即可使用POLARDB。 POLARDB在執行形態上是一個多節點叢集,叢集中有一個Writer節點(主節點)和多個Reader節點,他們之間節點間通過分散

10分鐘瞭解區塊鏈程式設計

談起這幾年最熱的技術,一定少不了區塊鏈。按說新技術的出現本是稀鬆平常的事情,但區塊鏈的出現和發展,卻有那麼一點讓人不淡定:其一,區塊鏈的代表應用比特幣,其價格在這七八年間翻了上百萬倍。2010年有人花10000個比特幣買了兩塊披薩,在比特幣最高價位時,這兩塊披薩相當於近兩億美元。其二,因為區塊鏈專案的大熱,相

6年資深開發帶你10分鐘瞭解Kafka ACL機制

1.概述 在Kafka0.9版本之前,Kafka叢集時沒有安全機制的。Kafka Client應用可以通過連線Zookeeper地址,例如zk1:2181:zk2:2181,zk3:2181等。來獲取儲存在Zookeeper中的Kafka元資料資訊。拿到Kafk

mysql5.7 新增的json欄位型別

一、我們先建立一個表,準備點資料 CREATE TABLE `json_test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `json` json DEFAULT NULL COMMENT 'json資料'

CentOS7安裝配置Nginx1.10 PHP5.6 MySQL5.7

準備工作 配置防火牆,開啟80埠、3306埠 刪除原有的 iptables , 新增合適的配置 rm -rf /etc/sysconfig/iptables vi /etc/sysconfig/iptables 新增如下內容 : ########

【python 協程】10分鐘瞭解下協程

協程 協程,又稱微執行緒,纖程。英文名Coroutine。 子程式,或者稱為函式,在所有語言中都是層級呼叫,比如A呼叫B,B在執行過程中又呼叫了C,C執行完畢返回,B執行完畢返回,最後是A執行完畢。所以子程式呼叫是通過棧實現的,一個執行緒就是執行一個子程式。

10分鐘瞭解MongoDB基本操作

                                              ——熊大大的親筆寫法 目錄

MySQL 5.7 使用原生JSON型別的例子

【原創文章,轉載請註明原文章地址,謝謝!】 首先回顧一下JSON的語法規則: 資料在鍵值對中, 資料由逗號分隔, 花括號儲存物件, 方括號儲存陣列。 按照最簡單的形式,可以用下面的JSON表示: {"NAME": "Brett", "email": "[emai

10分鐘瞭解分散式CAP、BASE理論

CAP理論 2000年7月,Eric Brewer教授提出CAP猜想;2年後,Seth Gilbert和Nancy Lynch從理論上證明了CAP;之後,CAP理論正式成為分散式計算領域的公認定理。 CAP定律說的是在一個分散式計算機系統中,一致性,可用性和分割槽容錯性這三種保證無法同時得到滿足,最多滿足兩

10分鐘瞭解一致性hash演算法

應用場景 當我們的資料表超過500萬條或更多時,我們就會考慮到採用分庫分表;當我們的系統使用了一臺快取伺服器還是不能滿足的時候,我們會使用多臺快取伺服器,那我們如何去訪問背後的庫表或快取伺服器呢,我們肯定不會使用迴圈或者隨機了,我們會在存取的時候使用相同的雜湊演算法定位到具體的位置。 簡單的雜湊演算法

mysql5.7安裝的實踐過程錯誤排查參考

dem 情況下 rod 添加 first row sco assume export 了解LAMP和安裝mysql服務 LAMP=Linux+Apache+Mysql+PHP四種組成的一個系統Apache和php必須在一臺服務器上才可使用,mysql可以通過網絡方式來提供服

mysql5.7.15的解除安裝安裝

解除安裝 1.  從控制面板中解除安裝mysql 2.  刪除環境變數中的mysql\bin 3.  停止mysql服務  (在執行框中輸入service.msc進入服務,找到mysql右鍵停止) 4

由淺入深瞭解Thrift(一)——Thrift介紹用法

2.6、  編寫客戶端程式碼 Thrift的客戶端程式碼同樣需要伺服器開頭的那兩步:新增三個jar包和生成的java介面檔案TestThriftService.java。 m_transport = new TSocket(THRIFT_HOST, THRIFT_PORT,2000); TP

mysql5.7版本json原生函式初體驗

mysql> select version(); +------------+ | version() | +------------+ | 5.7.18-log | +------------+ 1 row in set (0.00 sec) 測試資料 m

騰訊雲數據庫團隊:MySQL5.7 JSON實現簡單介紹

literal 白色 一定的 round tween extra inf features 操作性 作者介紹:吳雙橋 騰訊雲project師 閱讀原文。很多其它技術幹貨。請訪問fromSource=gwzcw.57435.57435.57