mysql中的json數(shù)據(jù)類型

1. json

JSON數(shù)組包含一個由逗號分隔的值列表民晒,并包含在 字符[和]字符中:

["abc", 10, null, true, false]

JSON對象包含一組由逗號分隔的鍵值對锄禽,并包含在字符{和 }字符中,JSON對象中的鍵必須是字符串:

{"k1": "value", "k2": 10}

在JSON數(shù)組元素和JSON對象鍵值中允許嵌套:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}

在MySQL中磁滚,JSON值被寫為字符串垂攘。MySQL解析在需要JSON值的上下文中使用的任何字符串淤刃,如果它作為JSON無效則會產(chǎn)生錯誤。

2. 創(chuàng)建json值

1.JSON_ARRAY 生成json數(shù)組
JSON_ARRAY(val1,val2,val3...)生成一個包含指定元素的json數(shù)組逸贾。

SELECT JSON_ARRAY(1, "abc", NULL, TRUE); -- [1, "abc", null, true]

2.JSON_OBJECT 生成json對象
JSON_OBJECT(key1,val1,key2,val2...) 生成一個包含指定K-V對的json object耕陷。如果有key為NULL或參數(shù)個數(shù)為奇數(shù),則拋錯饺蔑。

SELECT JSON_OBJECT('name', 'lily', 'age', 20); -- {"name": "lily", "age": 20}

3.JSON_QUOTE 加"號
JSON_QUOTE(json_val) -- 將json_val用"號括起來嗜诀。

SELECT JSON_QUOTE('[1,2,3]'); -- "[1,2,3]" 
  1. JSON_MERGE_PRESERVE()) 獲取兩個或多個JSON文檔并返回組合結果:
 SELECT JSON_MERGE_PRESERVE('[1, "abc"]', '{"name": "lily"}');-- [1, "abc", {"name": "lily"}]    

2.插入記錄
創(chuàng)建一個表

CREATE TABLE t_json(id INT PRIMARY KEY, name VARCHAR(20) , info  JSON);

插入含有json數(shù)組的記錄

INSERT INTO t_json VALUES( 1, 'Lily', JSON_ARRAY(20, "student",now()));

插入含有json對象的記錄

INSERT INTO t_json(id,name,info) VALUES( 2, 'Amy', JSON_OBJECT("age", 19, "time", now()));
INSERT INTO t_json(id,sname,info) VALUES( 3, 'Tom', '{"age":20, "time":"2019-01-1 08:00:00"}');

3. 搜索json值隆敢。

路徑表達式對于提取JSON文檔的一部分或修改JSON文檔的函數(shù)很有用,以指定該文檔中的操作位置穴墅。例如,以下查詢從JSON文檔中提取具有name鍵的成員的值 :

SELECT JSON_EXTRACT('{"id": 2, "name": "lucy"}', '$.name'); //lucy

路徑語法使用前導$字符來表示正在考慮的JSON文檔皇钞,可選地后跟選擇器夹界,它們連續(xù)指示文檔的更多特定部分:

  • 后跟密鑰名稱的句點用具有給定鍵的對象命名成員隘世。如果沒有引號的名稱在路徑表達式中不合法(例如,如果它包含空格)复斥,則必須在雙引號內(nèi)指定鍵名蔓钟。
  • [*N*]附加到a path,選擇一個數(shù)組命名數(shù)組中位置的值N 。數(shù)組位置是從零開始的整數(shù)键俱。
  • 路徑可以包含***通配符:
    • .[*] 計算JSON對象中所有成員的值。
    • [*] 計算JSON數(shù)組中所有元素的值缀辩。
    • prefix****suffix計算所有以命名前綴開頭并以命名后綴結尾的路徑臀玄。
  • 文檔中不存在的路徑(評估為不存在的數(shù)據(jù))的計算結果為NULL畅蹂。
[3, {"a": [5, 6], "b": 10}, [99, 100]]
//$[1]為{"a": [5, 6], "b": 10},$[1].a[1]為 6
//$[3]為NULL累贤。

如果路徑表達式中的未加引號的鍵名稱不合法,則必須引用命名鍵的路徑組件臼膏。讓我們$參考這個值示损,且密鑰都包含空格,必須引用:

{"a fish": "shark", "a bird": "sparrow"}
//$."a fish"`為 `shark`始鱼。
mysql> SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": [3, 4, 5]}', '$.*');//[1, 2, [3, 4, 5]] 

可以使用帶有to關鍵字的范圍來指定JSON數(shù)組的子集。

 SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');//[2, 3, 4]   

last關鍵字被支撐為最后一個元素的陣列中的索引的同義詞嘉汰。表單的表達式可用于相對尋址状勤,也可用于范圍定義,如下所示:last - *N*

 SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[last-3 to last-1]');//[2, 3, 4]  

4. 修改記錄

  1. json_array_insert()函數(shù):添加新值但不替換現(xiàn)有值
  SET @j = '["a", {"b": [true, false]}, [10, 20]]';
 SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2);
 // ["a", {"b": [true, false]}, [10, 20, 2]]   
  1. json_set(): 替換存在的路徑的值密似,并為不存在的路徑添加值:
 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]]   
  1. json_replace() 替換現(xiàn)有值并忽略新值:
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);
// ["a", {"b": [1, false]}, [10, 20]]   

4.JSON_REMOVE()獲取JSON文檔和一個或多個指定要從文檔中刪除的值的路徑葫盼。返回值是原始文檔減去文檔中存在的路徑選擇的值

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

5. JSON值的比較和排序

JSON值可以使用進行比較 =贫导、<、<=闺金、>峰档、>=、<>讥巡、!=、<=>
JSON值尚不支持以下比較運算符和函數(shù):BETWEEN槽棍、IN()吱涉、GREATEST()、LEAST()
以上列出的比較運算符和函數(shù)是通過將JSON值轉換為本機MySQL數(shù)值或字符串數(shù)??據(jù)類型特石,使它們具有一致的非JSON標量類型鳖链。
JSON值的比較發(fā)生在兩個級別墩莫。第一級比較基于比較值的JSON類型狂秦。如果類型不同推捐,則比較結果僅由哪種類型具有更高優(yōu)先級來確定。如果這兩個值具有相同的JSON類型牛柒,則使用特定于類型的規(guī)則進行第二級比較。

NULL->INTEGER, DOUBLE->STRING->OBJECT->ARRAY->BOOLEAN->DATE->TIME->DATETIME->OPAQUE->BIT->BLOB按此順序優(yōu)先級依次變大椭更。

對于具有相同優(yōu)先級的JSON值虑瀑,比較規(guī)則是特定于類型的:
1) BLOB、BIT舌狗、OPAQUE
比較兩個值 的第一個字節(jié)扔水,其中N是較短值中的字節(jié)數(shù)铭污。如果N兩個值的第一個字節(jié)相同嘹狞,則在較長值之前排序較短的值誓竿。
2) DATETIME
表示較早時間點的值在表示稍后時間點的值之前排序。如果兩個值最初 分別來自MySQL DATETIMETIMESTAMP類型筷屡,則它們相等,如果它們代表相同的時間點燎潮。
3)TIME
兩個時間值中較小的一個在較大的值之前排序扼倘。
4) DATE`
較早的日期是在最近的日期之前訂購的。
5) ARRAY
如果兩個JSON數(shù)組具有相同的長度并且數(shù)組中相應位置的值相等爪喘,則它們是相等的。如果數(shù)組不相等泛豪,則它們的順序由第一個位置中存在差異的元素確定侦鹏。首先排序在該位置具有較小值的數(shù)組。如果較短數(shù)組的所有值都等于較長數(shù)組中的相應值种柑,則首先排序較短的數(shù)組。

   [] < ["a"] < ["ab"] < ["ab", "cd", "ef"] < ["ab", "ef"]
  1. BOOLEAN
    false小于 true 荠雕。
  2. OBJECT`
    如果兩個JSON對象具有相同的鍵集驶赏,則它們是相等的,并且每個鍵在兩個對象中具有相同的值盖文。
   {"a": 1, "b": 2} = {"b": 2, "a": 1}//相等

8) STRING
字符串在被比較的兩個字符串以詞法字典序排序 五续,其中N是較短字符串的長度。如果N兩個字符串的第一個 字節(jié)相同疙驾,則認為較短的字符串小于較長的字符串它碎。

   "a" < "ab" < "b" < "bc"
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扳肛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挖息,更是在濱河造成了極大的恐慌蝉仇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睦疫,死亡現(xiàn)場離奇詭異鞭呕,居然都是意外死亡,警方通過查閱死者的電腦和手機瓦糕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門咕娄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珊擂,“玉大人,你說我怎么就攤上這事圣贸】富” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵用含,是天一觀的道長耕餐。 經(jīng)常有香客問我辟狈,道長,這世上最難降的妖魔是什么哼转? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任壹蔓,我火速辦了婚禮猫态,結果婚禮上,老公的妹妹穿的比我還像新娘勇凭。我一直安慰自己,他們只是感情好虾标,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布傀蚌。 她就那樣靜靜地躺著蘸吓,像睡著了一般善炫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上库继,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天箩艺,我揣著相機與錄音,去河邊找鬼制跟。 笑死舅桩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的雨膨。 我是一名探鬼主播擂涛,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聊记!你這毒婦竟也來了撒妈?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤排监,失蹤者是張志新(化名)和其女友劉穎狰右,沒想到半個月后棋蚌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谷暮,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡腾夯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年班利,在試婚紗的時候發(fā)現(xiàn)自己被綠了趾浅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皿哨。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖央勒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情井濒,我是刑警寧澤瑞你,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響嫩实,放射性物質發(fā)生泄漏。R本人自食惡果不足惜竟纳,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一缘挑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惶翻,春花似錦吕粗、人聲如沸颅筋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至收夸,卻和暖如春卧惜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茅姜。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留称诗,地道東北人寓免。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓享潜,卻偏偏與公主長得像疾就,于是被迫代替她去往敵國和親猬腰。 傳聞我的和親對象是個殘疾皇子姑荷,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 歌頌農(nóng)村換新容懈费,窮溝千嶺慶興隆憎乙。院起層樓奔大有,巷鋪硬道步錦程阵谚。
    沙漠小胡楊閱讀 159評論 0 2
  • 十字路口 文/雄關漫道 十字路口 一個老婦在燒著冥紙 焰火凝重了她的雙眸 風翻讀著她的記憶 我不知道,她要傾訴的 ...
    閆殿才閱讀 321評論 13 34