欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL JSON類型字段的簡單使用

 更新時間:2025年08月06日 10:18:40   作者:鍋菌魚  
JSON作為現(xiàn)在最為流行的數(shù)據(jù)交互形式,在5.7版本開始新增JSON數(shù)據(jù)類型,本文就來介紹一下MySQL JSON類型字段的使用,具有一定的參考價值,感興趣的可以了解一下

MySQL 5.7起支持JSON數(shù)據(jù)類型的字段。JSON作為現(xiàn)在最為流行的數(shù)據(jù)交互形式,MySQL也不斷跟進(jìn),在5.7版本開始新增JSON數(shù)據(jù)類型。雖然現(xiàn)在的應(yīng)用應(yīng)該還比較少,但也說不準(zhǔn)能成為一種趨勢。先簡單學(xué)習(xí)一下MySQL對JSON數(shù)據(jù)類型的相關(guān)操作和一些內(nèi)置函數(shù)(以下內(nèi)容基MySQL于8.0.13)。

PS: 以下內(nèi)容有不合理的地方,比如實際寫SQL的時候關(guān)鍵字應(yīng)該大寫,禁用SELECT *等,只是為了直觀,見諒~

創(chuàng)建含有JSON字段的表

create table test_json ( 
    `id` int auto_increment,
    `obj_json` JSON,
    `arr_json` JSON,
    primary key (`id`)
)engine = InnoDB default charset = utf8mb4;

JSON字段無需設(shè)置長度,也不能設(shè)置默認(rèn)值

插入JSON記錄

MySQL的JSON類型支持JSON數(shù)組和JSON對象

#JSON_ARRAY
["xin", 2019, null, true, false, "2019-5-14 21:30:00"]
#JSON_OBJECT
{"key1": "value", "key2": 2019, "time": "2015-07-29 12:18:29.000000"}

JSON_ARRAY和JSON_OBJECT值可為字符串,數(shù)值,null,時間類型,以及布爾值

JSON_OBJECT的鍵需為字符串類型

插入方式:直接通過字符串的形式

insert into test_json (obj_json, arr_json) 
       values ('{"key1": "value", "key2": 2019, "time": "2015-07-29 12:18:29.000000"}', 
               '["xin", 2019, null, true, false, "2019-5-14 21:30:00"]');

查詢結(jié)果

select * from test_json

插入方式:通過JSON_OBJECT(),JSON_ARRAY()

insert into test_json (obj_json, arr_json) 
    values (JSON_OBJECT('key1', 'insert by JSON_OBJECT', 'key2', 3.14159),
            JSON_ARRAY('Go', 'Ruby', 'Java', 'PHP'));

查詢結(jié)果

select * from test_json

PS:兩種類型可嵌套使用。

查詢含JSON類型的字段

前面可以通過select語句查詢含有JSON的記錄,結(jié)果如上所示。

如果要提取JSON字段中具體值呢?

OBJECT類型

col->path形式,其中表達(dá)式path為$.key

select obj_json->'$."key1"' key1, obj_json->'$."key2"' key2 from test_json;

ARRAY類型

col->path形式,其中表達(dá)式path為$[index]

select arr_json->'$[0]' index1, arr_json->'$[1]' index2 , arr_json->'$[2]' index3 from test_json;

JSON類型字段的更新

更新你當(dāng)然可以直接通過update覆蓋掉整個字段

接下來簡單介紹一下對JSON內(nèi)的更新

內(nèi)置函數(shù)JSON_SET(),JSON_INSERT(),JSON_REPLACE(),JSON_REMOVE()

JSON_SET() 插入值,如果存在則進(jìn)行覆蓋

update test_json
    set obj_json = JSON_SET(obj_json, '$."json_set_key"', 'json_set_value', '$.time', 'new time'),
        arr_json = JSON_SET(arr_json, '$[6]', 'seven element', '$[0]', 'replace first') 
    where id = 1;
select * from test_json where id = 1;

JSON_INSERT()插入值,不會覆蓋原有值

update test_json
    set obj_json = JSON_INSERT(obj_json, '$."json_insert_key"', 'json_insert_value', '$."key1"', 'Set existing key'),
        arr_json = JSON_INSERT(arr_json, '$[4]', 'json_insert_value', '$[0]', 'Set existing index') 
    where id = 2;
select * from test_json where id = 2;

JSON_REPLACE()只會覆蓋原來有的值

update test_json
    set obj_json = JSON_REPLACE(obj_json, '$."key1"', 'json_replace_key1', '$."json_replace_insert"', 'test'),
        arr_json = JSON_REPLACE(arr_json, '$[3]', 'PHP is best language!', '$[5]', 'json_replace_insert')
    where id = 2;
select * from test_json where id = 2;

JSON_REMOVE()移除

update test.test_json
    set obj_json = JSON_REMOVE(obj_json, '$."key1"', '$."Nonexistent key"'),
        arr_json = JSON_REMOVE(arr_json, '$[0]', '$[5]')
    where id = 2;
select * from test_json where id = 2;

其他

如果存儲的JSON有引號?

插入時需要進(jìn)行轉(zhuǎn)義

insert into test_json (obj_json, arr_json) values ('{"key1":  "test_obj_value1\\""}', '["\\"test_arr_value1\\""]');
insert into test_json (obj_json, arr_json) values (JSON_OBJECT('key1', '\"test_obj_value1 \'single\''), 
                                                   JSON_ARRAY('\"test_arr_value1\" \'single\''));

查詢

select obj_json->'$."key1"' obj_key1, arr_json->'$[0]' arr_index1 
    from test_json where id in (3, 4);

如果查詢結(jié)果不想保留轉(zhuǎn)義可采用col->>path的形式

select obj_json->>'$."key1"' obj_key1, arr_json->>'$[0]' arr_index1 
    from test_json where id in (3, 4);

合并函數(shù)JSON_MERGE_PRESERVE()和JSON_MERGE_PATCH()

8.0之后提供了合并函數(shù),可將多個JSON進(jìn)行合并

區(qū)別在于JSON_MERGE_PATCH()會將原有值覆蓋,而JSON_MERGE_PRESERVE()不會

下面進(jìn)行試驗一下(不插入表)

select
    JSON_MERGE_PATCH(
        JSON_OBJECT('obj_key1', 'obj_value1', 'obj_key2', 'obj_value2'),
        JSON_OBJECT('obj_key2', 'new_obj_value2')
    ) as col1,
    JSON_MERGE_PATCH(
        JSON_ARRAY('arr_index1', 'arr_index2', 'arr_index3'),
        JSON_ARRAY('arr_index4', 'arr_index5', 'arr_index6')
    ) as col12;

select
    JSON_MERGE_PRESERVE(
        JSON_OBJECT('obj_key1', 'obj_value1', 'obj_key2', 'obj_value2'),
        JSON_OBJECT('obj_key2', 'new_obj_value2')
    ) as col2,
    JSON_MERGE_PRESERVE(
        JSON_ARRAY('arr_index1', 'arr_index2', 'arr_index3'),
        JSON_ARRAY('arr_index4', 'arr_index5', 'arr_index6')
    ) as col3;

如前面所說,JSON數(shù)據(jù)類型支持嵌套,簡單演示一下

select
    JSON_MERGE_PRESERVE(
        JSON_ARRAY('arr_index1', 'arr_index2'),
        JSON_OBJECT('obj_key1', 'obj_value1')
    ) as col1,
    JSON_MERGE_PRESERVE(
        JSON_OBJECT('obj_key1', 'obj_value1'),
        JSON_ARRAY('arr_index1', 'arr_index2')
    ) as col2;

寫在最后

JSON類型字段的使用,應(yīng)當(dāng)認(rèn)真考慮數(shù)據(jù)庫設(shè)計,看看適不適合應(yīng)用JSON數(shù)據(jù)類型。開發(fā)往往結(jié)合其他語言使用,MySQL作為一款TRDB,有時候?qū)SON數(shù)據(jù)類型操縱會比較繁瑣,如強(qiáng)類型語言的ORM映射,是否使用JSON數(shù)據(jù)類型,還需結(jié)合實際情況斟酌。

參考資料:https://dev.mysql.com/doc/refman/8.0/en/json.html

到此這篇關(guān)于MySQL JSON類型字段的簡單使用的文章就介紹到這了,更多相關(guān)MySQL JSON使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Innodb存儲引擎中的后臺線程詳解

    Innodb存儲引擎中的后臺線程詳解

    后臺線程的主要作用是負(fù)責(zé)刷新內(nèi)存池中的數(shù)據(jù),保證緩存中的內(nèi)存緩存的是最近的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Innodb存儲引擎中后臺線程的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 通過存儲過程動態(tài)創(chuàng)建MySQL對象的流程步驟

    通過存儲過程動態(tài)創(chuàng)建MySQL對象的流程步驟

    在當(dāng)今數(shù)據(jù)驅(qū)動的世界中,高效的數(shù)據(jù)庫管理至關(guān)重要,本文將展示如何通過存儲過程自動化地創(chuàng)建各種?MySQL?數(shù)據(jù)庫對象,通過這些方法,我們可以快速響應(yīng)業(yè)務(wù)需求,提高數(shù)據(jù)庫管理的靈活性和效率,需要的朋友可以參考下
    2024-10-10
  • MySQL: mysql is not running but lock exists 的解決方法

    MySQL: mysql is not running but lock exists 的解決方法

    下面可以參考下面的方法步驟解決。最后查到一個網(wǎng)友說可能和log文件有關(guān),于是將log文件給移除了,再重啟MySQL終于OK了
    2009-06-06
  • mysql重裝后出現(xiàn)亂碼設(shè)置為utf8可解決

    mysql重裝后出現(xiàn)亂碼設(shè)置為utf8可解決

    mysql重裝后出現(xiàn)亂碼解決辦法:只能在配置文件中將database 和 server 字符集 設(shè)置為utf8 ,否則不起作用,具體如下感興趣的朋友可以參考下哈,希望對大家有所幫助
    2013-07-07
  • MySQL數(shù)據(jù)備份、還原、數(shù)據(jù)庫遷移以及表的導(dǎo)出和導(dǎo)入

    MySQL數(shù)據(jù)備份、還原、數(shù)據(jù)庫遷移以及表的導(dǎo)出和導(dǎo)入

    作為流行的開源數(shù)據(jù)庫管理系統(tǒng),MySQL的使用者眾多,為了維護(hù)數(shù)據(jù)安全性,數(shù)據(jù)備份是必不可少的,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)備份、還原、數(shù)據(jù)庫遷移以及表的導(dǎo)出和導(dǎo)入的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Mysql高效分頁詳解

    Mysql高效分頁詳解

    這篇文章主要為大家詳細(xì)介紹了Mysql高效分頁的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • mysql中使用shell語句實現(xiàn)xtrabackup自動物理備份增量備份

    mysql中使用shell語句實現(xiàn)xtrabackup自動物理備份增量備份

    這篇文章主要為大家介紹了mysql數(shù)據(jù)庫使用shell實現(xiàn)xtrabackup自動物理備份增量備份腳本,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • mysql啟動服務(wù)報1058錯誤的解決方法

    mysql啟動服務(wù)報1058錯誤的解決方法

    這篇文章主要介紹了mysql啟動服務(wù)報1058錯誤的解決方法,需要的朋友可以參考下
    2014-03-03
  • MySQL多表數(shù)據(jù)記錄查詢詳解

    MySQL多表數(shù)據(jù)記錄查詢詳解

    這篇文章主要為大家詳細(xì)介紹了MySQL多表數(shù)據(jù)記錄查詢操作,具有一定的實用性,感興趣的小伙伴們可以參考一下
    2016-08-08
  • linux mysql 安裝與操作

    linux mysql 安裝與操作

    mysql是linux平臺下最流行的數(shù)據(jù)庫系統(tǒng),今天介紹的是mysql的安裝及簡單的操作方法!
    2009-06-06

最新評論