自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 MySQL 8.0 操作 JSON 實(shí)踐

數(shù)據(jù)庫 MySQL
經(jīng)過漫長(zhǎng)的測(cè)試,即將整體遷移至Mysql8.0; Mysql8.0 對(duì)于Json操作新增/優(yōu)化了很多相關(guān)Json的API操作。

[[429750]]

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

閱讀了一下官方文檔,雖然絕大多數(shù)的JSON操作都是應(yīng)用層完成,但是會(huì)一些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

簡(jiǎn)單概述

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

JSON基礎(chǔ)工具 

  1. //使用JSON_ARRAY方法定義JSON數(shù)組; 
  2. SELECT JSON_ARRAY(1, "abc"NULLTRUE, CURTIME()) 
  3. //結(jié)果:[1, "abc"nulltrue"11:30:24.000000"]   
  4.  
  5. //JSON_OBJECT 方法定義JSON對(duì)象 
  6. SELECT JSON_OBJECT('id', 87, 'name''carrot'
  7. //結(jié)果{"id": 87, "name""carrot"
  8.  
  9. //數(shù)組 與 對(duì)象嵌套的場(chǎng)景; 
  10. [99, {"id""HK500""cost": 75.99}, ["hot""cold"]] {"k1""value""k2": [10, 20]} 
  11.  
  12. //日期/時(shí)間類型定義 
  13. ["12:18:29.000000""2015-07-29""2015-07-29 12:18:29.000000"
  14.  
  15.  //JSON_QUOTE 將JSON對(duì)象轉(zhuǎn)義成String, 就是將內(nèi)部的符  號(hào)進(jìn)行轉(zhuǎn)義,并整體包裹上雙引號(hào); 
  16. JSON_QUOTE(' "null" '
  17. //結(jié)果 "\"null\"" 
  18.  
  19. //將JSON內(nèi)容美化并輸出; 
  20. JSON_PRETTY() 
  21.  
  22. //可以將JSON/JSON內(nèi)部的元素轉(zhuǎn)化為其他數(shù)據(jù)類型; 
  23. //如下將JSON jdoc 中的id元素,轉(zhuǎn)化為 unsigned int
  24. [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) 
  25. ORDER BY CAST(JSON_EXTRACT(jdoc, '$.id'AS   UNSIGNED); 

合并JSON的操作 JSON_MERGE_PRESERVE() and JSON_MERGE_PATCH() 實(shí)際業(yè)務(wù)用的可能性很少;-> -->操作符,按照key 找值;區(qū)別在于 -->會(huì)去除包裹的”以及轉(zhuǎn)義符號(hào); 它的等價(jià)的Function形式是JSON_EXTRACT() 。

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

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

以下面這段JSON為例: 

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

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

  1. $[1].a = [5,6] 
  2. $[1].a[1] = 6 
  3. $[1].b = 10; 
  4. $[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é)束的所有路徑;另外,MySQL 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。

查找并修改JSON 

  1. //如上, 應(yīng)該可以用-->語法取代; 
  2. mysql> SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}''$.*'); 
  3. //[1, 2, [3, 4, 5]]   
  4. SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}''$.c[*]'
  5. //[3, 4, 5] 
  6. SELECT JSON_EXTRACT('{"a": {"b": 1}, "c": {"b": 2}}''$**.b'); 
  7. //[1, 2] 
  8. SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]''$[1 to 3]'); 
  9. //[2, 3, 4] 
  10.  
  11. //JSON_SET JSON_INSERT JSON_REPLACE JSON_REMOVE 
  12. SET @j = '["a", {"b": [true, false]}, [10, 20]]'
  13. SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2); 
  14. //| ["a", {"b": [1, false]}, [10, 20, 2]]     
  15.  
  16. SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2); 
  17. //["a", {"b": [truefalse]}, [10, 20, 2]] 
  18.  
  19. JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2) 
  20. //["a", {"b": [1, false]}, [10, 20]] 
  21.  
  22. SELECT JSON_REMOVE(@j, '$[2]''$[1].b[1]''$[1].b[1]'); 
  23. //["a", {"b": [true]}] 

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

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

 

 

責(zé)任編輯:龐桂玉 來源: 馬哥Linux運(yùn)維
相關(guān)推薦

2021-06-03 19:13:06

MySQLJson數(shù)據(jù)

2021-10-26 10:51:30

GoxormMySQL

2010-09-06 14:42:43

2018-05-03 10:33:14

數(shù)據(jù)庫MySQL 8.0角色管理

2022-09-20 10:44:06

MySQL 8.0數(shù)據(jù)庫DDL

2011-12-26 16:33:02

WCF

2023-10-25 14:51:38

MySQL數(shù)據(jù)庫JSON

2017-11-16 09:03:56

數(shù)據(jù)庫MySQLJSON

2009-12-01 10:12:39

FreeBSD 8.0操作系統(tǒng)

2012-10-15 13:38:50

IBMdw

2024-02-26 07:39:16

2021-01-27 09:19:44

MySQL數(shù)據(jù)優(yōu)化器

2018-09-19 16:15:18

MySQL直方圖數(shù)據(jù)庫

2020-09-25 17:10:13

LinuxMySQL 8.0

2022-10-10 08:01:08

MySQL字典表

2009-06-04 15:59:53

Netbeans操作MMySQL數(shù)據(jù)庫

2020-12-31 05:35:53

MySQL 8.0MySQL 5.7JSON

2020-11-03 14:50:18

CentOSMySQL 8.0數(shù)去庫

2021-06-09 19:23:52

MySQLROLE管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)