1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        MySQL 8.0 可以操作 JSON 了,牛!

        共 5845字,需瀏覽 12分鐘

         ·

        2021-09-22 21:46

        作者 | 旺財(cái)不哭

        來源 | https://www.jianshu.com/p/d4b012769a3b

        經(jīng)過漫長的測試,即將整體遷移至Mysql8.0; Mysql8.0 對于Json操作新增/優(yōu)化了很多相關(guān)Json的API操作。

        閱讀了一下官方文檔,雖然絕大多數(shù)的JSON操作都是應(yīng)用層完成,但是會一些Mysql的JSON語法,方便進(jìn)行debug;選出基礎(chǔ)的, 有價(jià)值的部分,供未來參考;

        https://dev.mysql.com/doc/refman/8.0/en/json.html https://dev.mysql.com/doc/refman/8.0/en/json-utility-functions.html


        簡單概述

        • 不允許為null; Json格式定義與LONGBLOB or LONGTEXT類似;它的最大長度是受到max_allowed_packet所控制的;
        • 查看JSON字段所占用空間大小的函數(shù)時(shí)JSON_STORAGE_SIZE(xxx);
        • 除普通的Json操作,額外支持GeoJSON (基于幾何圖形的針對地理空間數(shù)據(jù)交換格式)一些相關(guān)操作;
        • 對Json欄位支持索引(結(jié)合Mysql8.0新特性,函數(shù)index);
        • 一個(gè)可以支持部分的,原地更新Json Column 的可選優(yōu)化項(xiàng)加入MySql8.0; 可以使用的函數(shù)有JSON_SET()JSON_REPLACE() ,JSON_REMOVE(); 使用時(shí),有一些約束,但是會有更加的性能;

        JSON基礎(chǔ)工具;

        //使用JSON_ARRAY方法定義JSON數(shù)組;
        SELECT JSON_ARRAY(1"abc"NULLTRUECURTIME())
        //結(jié)果:[1"abc"nulltrue"11:30:24.000000"]  

        //JSON_OBJECT 方法定義JSON對象
        SELECT JSON_OBJECT('id'87'name''carrot')
        //結(jié)果{"id"87"name""carrot"}

        //數(shù)組 與 對象嵌套的場景;
        [99, {"id""HK500""cost"75.99}, ["hot""cold"]] {"k1""value""k2": [1020]}

        //日期/時(shí)間類型定義
        ["12:18:29.000000""2015-07-29""2015-07-29 12:18:29.000000"]

         //JSON_QUOTE 將JSON對象轉(zhuǎn)義成String, 就是將內(nèi)部的符  號進(jìn)行轉(zhuǎn)義,并整體包裹上雙引號;
        JSON_QUOTE(' "null" ')
        //結(jié)果 "\"null\""

        //將JSON內(nèi)容美化并輸出;
        JSON_PRETTY()

        //可以將JSON/JSON內(nèi)部的元素轉(zhuǎn)化為其他數(shù)據(jù)類型;
        //如下將JSON jdoc 中的id元素,轉(zhuǎn)化為 unsigned int;
        [https://dev.mysql.com/doc/refman/8.0/en/json.html#json-converting-between-types]    (https://dev.mysql.com/doc/refman/8.0/en/json.html#json-converting-between-types)
        ORDER BY CAST(JSON_EXTRACT(jdoc, '$.id') AS   UNSIGNED);

        合并JSON的操作 JSON_MERGE_PRESERVE() and JSON_MERGE_PATCH() 實(shí)際業(yè)務(wù)用的可能性很少;

        如果您正在學(xué)習(xí)Spring Boot,推薦一個(gè)連載多年還在繼續(xù)更新的免費(fèi)教程:http://blog.didispace.com/spring-boot-learning-2x/

        -> -->操作符,按照key 找值;區(qū)別在于 -->會去除包裹的”以及轉(zhuǎn)義符號; 它的等價(jià)的Function形式是JSON_EXTRACT()

        // {"mascot": "Our mascot is a dolphin named \"Sakila\"."}
        mysql> SELECT col->"$.mascot" FROM qtest;
        //結(jié)果:| "Our mascot is a dolphin named \"Sakila\"." |
        SELECT sentence->>"$.mascot" FROM facts;
        // 結(jié)果: | Our mascot is a dolphin named "Sakila". |

        JSON Path expression上面 --> 后雙引號中的內(nèi)容就是所謂的JSON Path expression; 該語法是ECMAScript規(guī)范的一部分,所以前端程序員應(yīng)該特別熟悉。

        以下面這段JSON為例;

         [3, {"a": [5, 6], "b": 10}, [99, 100]]
         $[0] = 3 ;
         $[1] = {"a": [5, 6], "b": 10};
         $[2] = [99, 100];

        與此同時(shí),[2] 并非標(biāo)量, 進(jìn)一步

        $[1].a = [5,6]
        $[1].a[1] = 6
        $[1].b = 10;
        $[2][0] = 99;

        更進(jìn)一步支持的語法特性$[n to m]

         $[ 1 to 2] = [{"a": [5, 6], "b": 10}, [99, 100]]
         $[last-2 to last-1] = [3, {"a": [5, 6], "b": 10}]

        總結(jié)一下;

        a .是代表所有的members in object; b []是代表所有的cells in array; c [prefix] ** suffix 是代表以prefix開始,以suffix為結(jié)束的所有路徑;

        查找并修改JSON

        //如上, 應(yīng)該可以用-->語法取代;
        mysql> SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}''$.*');
        //[1, 2, [3, 4, 5]]  
        SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}''$.c[*]')
        //[345]
        SELECT JSON_EXTRACT('{"a": {"b": 1}, "c": {"b": 2}}''$**.b');
        //[1, 2]
        SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]''$[1 to 3]');
        //[2, 3, 4]

        //JSON_SET JSON_INSERT JSON_REPLACE JSON_REMOVE
        SET @j = '["a", {"b": [true, false]}, [10, 20]]';
        SELECT JSON_SET(@j, '$[1].b[0]'1'$[2][2]'2);
        //| ["a", {"b": [1, false]}, [10, 20, 2]]    

        SELECT JSON_INSERT(@j, '$[1].b[0]'1'$[2][2]'2);
        //["a", {"b": [true, false]}, [10, 20, 2]]

        JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2)
        //["a", {"b": [1, false]}, [10, 20]]

        SELECT JSON_REMOVE(@j, '$[2]''$[1].b[1]''$[1].b[1]');
        //["a", {"b": [true]}]

        JSON Table Functions

        一個(gè)比較常見的場景是JSON數(shù)據(jù)本身是一個(gè)表的結(jié)構(gòu);JSON_TABLE(*expr*, *path* COLUMNS (*column_list*) [AS\] *alias*)

        SELECT *  FROM JSON_TABLE(   '[{"a":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]',
          ->     "$[*]"
          ->     COLUMNS(
          ->       rowid FOR ORDINALITY,
          ->       ac VARCHAR(100PATH "$.a" DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR,
          ->       aj JSON PATH "$.a" DEFAULT '{"x": 333}' ON EMPTY,
          ->       bx INT EXISTS PATH "$.b"
          ->     )
          ->   ) AS tt;
        • Comparison and Ordering of JSON Values目前沒感覺倒價(jià)值;
        • Aggregation of JSON Values目前沒感覺倒價(jià)值; 將返回值轉(zhuǎn)成其他類型就可以使用聚合函數(shù);

        往期推薦

        來!一起搭建個(gè)永久運(yùn)行的個(gè)人服務(wù)器吧!

        笑出腹肌的注釋,都是被代碼耽誤的詩人!

        快速搭建Java 17環(huán)境并玩轉(zhuǎn)Record特性

        一個(gè)Bug能有多大影響:虧損30億、致6人死亡、甚至差點(diǎn)毀滅世界...

        六成大學(xué)生認(rèn)為自己畢業(yè)10年內(nèi)會年入百萬!網(wǎng)友:知乎上多了,沒被社會毒打過吧!


        技術(shù)交流群

        最近有很多人問,有沒有讀者交流群,想知道怎么加入。加入方式很簡單,有興趣的同學(xué),只需要點(diǎn)擊下方卡片,回復(fù)“加群,即可免費(fèi)加入我們的高質(zhì)量技術(shù)交流群!

        點(diǎn)擊閱讀原文,送你免費(fèi)Spring Boot教程!

        瀏覽 49
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲日本在线观看 | 可以看操逼视频的网站 | 久久国产乱子伦精品一区二区豆花 | 精品激情 | 欧美成人性另类在线视频 | 爱草视频 | 91麻豆精品国产自产在线游戏 | 国产一级婬片A片AAA毛片炙热 | 蜜穴视频| 中国免费毛片视频 |