MySQL 5.7新特性| Json Column和Generated Column(上)

mysql 5.7 json介紹前言

MySQL5.7新增兩種字段類型:Json和Generated,Generated型的產生和Json的關系密不可分,如果沒有Generated類型,Json類型在強大,生產中可能也無法使用,因為Json不支持索引,但是如果要查詢Json里的數據,沒有索引就是全表掃描,在執行效率上肯定是不能用于生產環境的,但是有了Generated類型就不同了,Generated類型簡單地說是一個虛擬字段,值是不可更新的,值來源其他字段或者字段間計算或是轉化而來的,這種類型是可以創建索引,利用Generated的特性,就可以間接的給Json類型中的key創建索引,解決Json不能創建索引的問題。簡而言之,?Generated類型的產生,為Json類型在索引方面的問題提供了支持。JSON的值包含單個值、數組、元組、標注的Json格式等幾種格式。

客觀地說,Json類型的出現,為研發提供了便利,提供了類似NoSQL的支持,但是走DBA運維的角度來看,也許是一個麻煩,這個麻煩和text等大字段的麻煩是一致的,json可能在實際的生產中會成為text字段的變種,望DBA在以后5.7的使用中密切關注這個類型。

創建帶有JSON字段的表

直接創建一張測試帶JSON字段的表

CREATE?TABLE?json_test?(  ??id?int(11)?NOT?NULL?AUTO_INCREMENT,  ??group_name?varchar(20)?DEFAULT?NULL,  ??user_info?json?DEFAULT?NULL,  ??PRIMARY?KEY?(id)  )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8;

或是在表中添加一個JSON類型的字段

?ALTER?TABLE?json_test?ADD?COLUMN?user_info?JSON?DEFAULT?NULL;

插入數據

MySQL 5.7新特性| Json Column和Generated Column(上)

JSON字段相關查詢

1、查詢全部結果

MySQL 5.7新特性| Json Column和Generated Column(上)

2:JSON_EXTRACT查詢

JSON_EXTRACT這個函數主要用作精確匹配,如查找user_info中age=21的記錄或者查詢name=’wangwei’的記錄,或者name like ‘%wangwei%’模糊查詢:

SELECT?*?FROM?json_test?WHERE?JSON_EXTRACT(user_info,'$.age')=21;

MySQL 5.7新特性| Json Column和Generated Column(上)

MySQL 5.7新特性| Json Column和Generated Column(上)

在值為數組的時候,數組的起始位置值為0,同時,MySQL在5.5.9的版本增加了->,提供了等價于JSON_EXTRACT另外一種寫:

SELECT?*?FROM?json_test?WHERE?user_info->"$.age"=21;

MySQL 5.7新特性| Json Column和Generated Column(上)

MySQL 5.7新特性| Json Column和Generated Column(上)

3、JSON_SEARCH查詢

JSON_SEARCH字符串查找函數,查找json所有key中值為字符串’wangwei’的記錄,為精確匹配;加上%的話有點like的意思:

SELECT?*?FROM?json_test?WHERE?JSON_SEARCH(user_info,'all','wangwei')?IS?NOT?NULL;  SELECT?*?FROM?json_test?WHERE?JSON_SEARCH(user_info,'all','wangwei%')?IS?NOT?NULL;  SELECT?*?FROM?json_test?WHERE?JSON_SEARCH(user_info,'all','%wangwei%')?IS?NOT?NULL;

4、JSON_CONTAINS判斷key是否包含指定的值

JSON_CONTAINS判斷key是否包含指定的值,返回值為0或1或者是null,對應的情況為不包含、包含、和指定的key不存在集中情況:

MySQL 5.7新特性| Json Column和Generated Column(上)

5、JSON_CONTAINS_PATH判斷key在字段中是否存在

JSON_CONTAINS_PATH判斷key在字段中是否存在,返回值為0和1,格式為JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] …),如果為one的時候,代表path中只要有一個在就為1,反之為0;如果為all的話必須全部包含,返回為1,反之為0:

MySQL 5.7新特性| Json Column和Generated Column(上)

6、JSON_LENGTH長度查詢

JSON_LENGTH是用來計算JSON字段的長度:

MySQL 5.7新特性| Json Column和Generated Column(上)

7:JSON_DEPTH層級查詢

JSON_DEPTH這個主要是用來查詢Json字段的層級,空的為1,所以正常情況下Json字段類型不為空,這個值的查詢出的結果應該大于等于2:

MySQL 5.7新特性| Json Column和Generated Column(上)

8:JSON_TYPE查詢Json字段中key值的數據類型

JSON_TYPE主要用于查詢Json字段類型中key值的數據類型,顯示的類型按照分類如下:

Purely JSON types:

OBJECT: JSON objects;ARRAY: JSON arrays;BOOLEAN: The JSON true and false literals;NULL: The JSON null literal

Numeric types:

INTEGER: MySQL TINYINT, SMALLINT, MEDIUMINT and INT and BIGINT scalars;DOUBLE: MySQL DOUBLE FLOAT scalars;DECIMAL: MySQL DECIMAL and NUMERIC scalars

Temporal types:

DATETIME: MySQL DATETIME and TIMESTAMP scalars;DATE: MySQL DATE scalars;TIME: MySQL TIME scalars

String types:

STRING: MySQL utf8 character type scalars;CHAR, VARCHAR, TEXT, ENUM, and SET

Binary types:

BLOB: MySQL binary type scalars;BINARY, VARBINARY, BLOB;BIT: MySQL BIT scalars

All other types:

OPAQUE (raw bits)

MySQL 5.7新特性| Json Column和Generated Column(上)

9、JSON_UNQUOTE去掉前后特殊字符

JSON_UNQUOTE主要是用來去掉前后的特殊字符,格式化值,目前支持一下幾種字符:

MySQL 5.7新特性| Json Column和Generated Column(上)

MySQL 5.7新特性| Json Column和Generated Column(上)

以上就是MySQL 5.7新特性| Json Column和Generated Column(上)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享