天天看點

MySQL json 資料類型_MySQL JSON資料類型操作

概述

mysql自5.7.8版本開始,就支援了json結構的資料存儲和查詢,這表明了mysql也在不斷的學習和增加nosql資料庫的有點。但mysql畢竟是關系型資料庫,在處理json這種非結構化的資料時,還是比較别扭的。

建立一個JSON字段的表

首先先建立一個表,這個表包含一個json格式的字段:

CREATE TABLE table_name (

id INT NOT NULL AUTO_INCREMENT,

json_col JSON,

PRIMARY KEY(id)

);複制代碼

上面的語句,主要注意json_col這個字段,指定的資料類型是JSON。

插入一條簡單的JSON資料

INSERT INTO

table_name (json_col)

VALUES

('{"City": "Galle", "Description": "Best damn city in the world"}');複制代碼

上面這個SQL語句,主要注意VALUES後面的部分,由于json格式的資料裡,需要有雙引号來辨別字元串,是以,VALUES後面的内容需要用單引号包裹。

插入一條複雜的JSON資料

INSERT INTO table(col)

VALUES('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}');複制代碼

這地方,我們插入了一個json數組。主要還是注意單引号和雙引号的問題。

修改JSON資料

之前的例子中,我們插入了幾條JSON資料,但是如果我們想修改JSON資料裡的某個内容,怎麼實作了?比如我們向 variations 數組裡增加一個元素,可以這樣:

UPDATE myjson SET dict=JSON_ARRAY_APPEND(dict,'$.variations','scheveningen') WHERE id = 2;複制代碼

這個SQL語句中,$符合代表JSON字段,通過.号索引到variations字段,然後通過JSON_ARRAY_APPEND函數增加一個元素。現在我們執行查詢語句:

SELECT * FROM myjson複制代碼

得到的結果是:

+----+-----------------------------------------------------------------------------------------+

| id | dict |

+---+-----------------------------------------------------------------------------------------+

| 2 | {"opening": "Sicilian", "variations": ["pelikan", "dragon", "najdorf", "scheveningen"]} |

+----+-----------------------------------------------------------------------------------------+

1 row in set (0.00 sec)複制代碼

關于MySQL中,JSON資料的擷取方法,參照官方連結JSON Path Syntax

建立索引

MySQL的JSON格式資料不能直接建立索引,但是可以變通一下,把要搜尋的資料單獨拎出來,單獨一個資料列,然後在這個字段上鍵一個索引。下面是官方的例子:

mysql> CREATE TABLE jemp (

-> c JSON,

-> g INT GENERATED ALWAYS AS (c->"$.id"),

-> INDEX i (g)

-> );

Query OK, 0 rows affected (0.28 sec)

mysql> INSERT INTO jemp (c) VALUES

> ('{"id": "1", "name": "Fred"}'), ('{"id": "2", "name": "Wilma"}'),

> ('{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}');

Query OK, 4 rows affected (0.04 sec)

Records: 4 Duplicates: 0 Warnings: 0

mysql> SELECT c->>"$.name" AS name

> FROM jemp WHERE g > 2;

+--------+

| name |

+--------+

| Barney |

| Betty |

+--------+

2 rows in set (0.00 sec)

mysql> EXPLAIN SELECT c->>"$.name" AS name

> FROM jemp WHERE g > 2\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: jemp

partitions: NULL

type: range

possible_keys: i

key: i

key_len: 5

ref: NULL

rows: 2

filtered: 100.00

Extra: Using where

1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G

*************************** 1. row ***************************

Level: Note

Code: 1003

Message: select json_unquote(json_extract(`test`.`jemp`.`c`,'$.name'))

AS `name` from `test`.`jemp` where (`test`.`jemp`.`g` > 2)

1 row in set (0.00 sec)複制代碼

這個例子很簡單,就是把JSON字段裡的id字段,單獨拎出來成字段g,然後在字段g上做索引,查詢條件也是在字段g上。

字元串轉JSON格式

把json格式的字元串轉換成MySQL的JSON類型:

SELECT CAST('[1,2,3]' as JSON) ;

SELECT CAST('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}' as JSON);複制代碼

所有MYSQL JSON函數

Name

Description

JSON_APPEND()

Append data to JSON document

JSON_ARRAY()

Create JSON array

JSON_ARRAY_APPEND()

Append data to JSON document

JSON_ARRAY_INSERT()

Insert into JSON array-> Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT().

JSON_CONTAINS()

Whether JSON document contains specific object at path

JSON_CONTAINS_PATH()

Whether JSON document contains any data at path

JSON_DEPTH()

Maximum depth of JSON document

JSON_EXTRACT()

Return data from JSON document->> Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()).

JSON_INSERT()

Insert data into JSON document

JSON_KEYS()

Array of keys from JSON document

JSON_LENGTH()

Number of elements in JSON document

JSON_MERGE()

Merge JSON documents, preserving duplicate keys. Deprecated synonym for JSON_MERGE_PRESERVE()

JSON_MERGE_PRESERVE()

Merge JSON documents, preserving duplicate keys

JSON_OBJECT()

Create JSON object

JSON_QUOTE()

Quote JSON document

JSON_REMOVE()

Remove data from JSON document

JSON_REPLACE()

Replace values in JSON document

JSON_SEARCH()

Path to value within JSON document

JSON_SET()

Insert data into JSON document

JSON_TYPE()

Type of JSON value

JSON_UNQUOTE()

Unquote JSON value

JSON_VALID()

Whether JSON value is valid

轉載自我的部落格捕蛇者說