A. mysql json類型的一些說明
以前最討厭英語了,然而沒有想到有一天居然要看英文文檔學習東西的時候,只想說MMP。下面就是一些學習的東西的記錄啦。
之前聽小夥伴說他們用的 pgsql ,pgsql 是如何如何牛逼,支持json。然後就去學習了下,但是公司用的是mysql,然後某個項目mysql用了5.7.20版本,這個版本支持json,所以就又學習了一波。吐槽完畢,下面就是正文了。
mysql5.7版本支持json,具體說的是5.7.8開始。這是需要注意的,然後可以的話大家還是看下官方文檔吧。
mysql 5.7 josn官方文檔地址
我這里 json_content 就定義的是json類型,下面就是基本的操作,後續會寫一些json函數。
這算是一個比較復雜的json了,array裡面放的是一個數組,other放了另一個對象。下面我再插入幾條數據。
下面兩條的數據和第一條不一樣,是為了做一些說明用。lisi這條數據所有的欄位都有,但是數據和張三略有不同,而wangwu這條數據就有些欄位沒有。
說明下,我原來用的navicat發現查josn的時候是空 select * 的時候定義的json欄位會不顯示,然後換了新版本就好了。
結果如下:
上面兩條sql都是通過json對象中flag=0的數據,然後上面兩條sql是等價的。JSON_EXTRACT函數的語法為:JSON_EXTRACT(欄位名,『$.key』),這個函數可以在條件中使用,也可以在查詢的時候使用。如下:
結果如下:
嗯哼,沒錯 JSON_EXTRACT 這個函數是用來獲取json對象中指定key的值的。這是一個很常用的函數。
上面既然提到了time,那麼就用time來展示下吧。json對象中的時間,可以直接拿來比較,sql如下:
結果如下:
我的條件限定的是 2018-06-05 15:49:00 之後,獲取到了2條數據,是不是很神奇呢。這里就要說明下了,這里涉及到了json對象裡面對key對應的value進行比較的時候會有一個優先順序,mysql會按照這個優先順序來轉換,然後進行比較,這里只貼一下優先順序情況,各個類型的比較的規則自己去文檔裡面看吧。
下面再介紹兩個查詢時候會用到的函數JSON_CONTAINS() 和 JSON_CONTAINS_PATH()。
下面就是具體的例子:
結果如下:
結果如下:
結果如下:
結果如下:
用法還是比較簡單的,嗯,可能有小夥伴會問我要查詢不滿足條件的數據呢?很簡單,比如上面的sql,修改成:
查詢暫時就介紹這么多吧,後續可能會補充,現在介紹下修改。
JSON修改的函數比較多,這里介紹一些應該會常用到的。
id=2的數據結果變為:
id=2的數據結果變為:
說明:假設這里key已經存在,那麼本次已經存在的將不會被修改,同時可以添加多個。
id=2的數據結果變為:
id=2的數據結果變為:
說明下,如果指定的key不存在,那麼不存在的修改無效,存在的會被修改。
id=2的數據結果變為:
說明下,JSON_SET已經存在的會被修改,不存在的會被增加。
下面介紹一些其他函數。
暫時就寫這么多吧,後續再進行補充。本人也是剛開始接觸mysql的json,如果有問題請指教~
B. mysql(5.6及以下)解析json
example:裂穗
select json_extract_c(json, "瞎源渣$.totalDays"磨悄), json from item limit 100;
C. mysql中的json數據類型
JSON數組包含一個由逗號分隔的值列表,並包含在 字元[和]字元中:
JSON對象包含一組由逗號分隔的鍵值對,並包含在字元{和 }字元中,JSON對象中的鍵必須是字元串:
在JSON數組元素和JSON對象鍵值中允許嵌套:
在MySQL中,JSON值被寫為字元串。MySQL解析在需要JSON值的上下文中使用的任何字元串,如果它作為JSON無效則會產生錯誤。
1.JSON_ARRAY 生成json數組
JSON_ARRAY(val1,val2,val3...)生成一個包含指定元素的json數組。
2.JSON_OBJECT 生成json對象
JSON_OBJECT(key1,val1,key2,val2...) 生成一個包含指定K-V對的json object。如果有key為NULL或參數個數為奇數,則拋錯。
3.JSON_QUOTE 加"號
JSON_QUOTE(json_val) -- 將json_val用"號括起來。
2.插入記錄
創建一個表
插入含有json數組的記錄
插入含有json對象的記錄
路徑表達式對於提取JSON文檔的一部分或修改JSON文檔的函數很有用,以指定該文檔中的操作位置。例如,以下查詢從JSON文檔中提取具有 name 鍵的成員的值 :
路徑語法使用前導 $ 字元來表示正在考慮的JSON文檔,可選地後跟選擇器,它們連續指示文檔的更多特定部分:
如果路徑表達式中的未加引號的鍵名稱不合法,則必須引用命名鍵的路徑組件。讓我們 $ 參考這個值,且密鑰都包含空格,必須引用:
可以使用帶有 to 關鍵字的范圍來指定JSON數組的子集。
last關鍵字被支撐為最後一個元素的陣列中的索引的同義詞。表單的表達式可用於相對定址,也可用於范圍定義,如下所示: last - * N *
4.JSON_REMOVE()獲取JSON文檔和一個或多個指定要從文檔中刪除的值的路徑。返回值是原始文檔減去文檔中存在的路徑選擇的值
JSON值可以使用進行比較 =、<、<=、>、>=、<>、!=、<=>
JSON值尚不支持以下比較運算符和函數:BETWEEN、IN()、GREATEST()、LEAST()
以上列出的比較運算符和函數是通過將JSON值轉換為本機MySQL數值或字元串數據類型,使它們具有一致的非JSON標量類型。
JSON值的比較發生在兩個級別。第一級比較基於比較值的JSON類型。如果類型不同,則比較結果僅由哪種類型具有更高優先順序來確定。如果這兩個值具有相同的JSON類型,則使用特定於類型的規則進行第二級比較。
NULL->INTEGER, DOUBLE->STRING->OBJECT->ARRAY->BOOLEAN->DATE->TIME->DATETIME->OPAQUE->BIT->BLOB按此順序優先順序依次變大。
對於具有相同優先順序的JSON值,比較規則是特定於類型的:
1) BLOB、BIT、OPAQUE
比較兩個值 的第一個位元組,其中N是較短值中的位元組數。如果N兩個值的第一個位元組相同,則在較長值之前排序較短的值。
2) DATETIME
表示較早時間點的值在表示稍後時間點的值之前排序。如果兩個值最初 分別來自MySQL DATETIME 和 TIMESTAMP 類型,則它們相等,如果它們代表相同的時間點。
3)TIME
兩個時間值中較小的一個在較大的值之前排序。
4) DATE`
較早的日期是在最近的日期之前訂購的。
5) ARRAY
如果兩個JSON數組具有相同的長度並且數組中相應位置的值相等,則它們是相等的。如果數組不相等,則它們的順序由第一個位置中存在差異的元素確定。首先排序在該位置具有較小值的數組。如果較短數組的所有值都等於較長數組中的相應值,則首先排序較短的數組。
8) STRING
字元串在被比較的兩個字元串以詞法字典序排序 ,其中 N 是較短字元串的長度。如果 N 兩個字元串的第一個 位元組相同,則認為較短的字元串小於較長的字元串。
D. mysql5.5支持json嗎
是的,MySQL5.5支持JSON數李神據類型。MySQL5.5引入了原哪州虧有的JSON類型,使用該類型可以將這些信息存儲在跡卜單個表內,創建起來也很簡單,非常適合處理復雜的數據結構。
E. 怎麼在mysql中放入json數據
josn格式在需要處理的JSON這篇日誌中,鏈接:http://blog.163.com/songyalong1117@126/blog/static/1713918972014631258548/
處理JSON格式的文本有多種方法,寫一下我的方法,請大家指點一下。
先分析一下JSON格式,主要框架有user、statu,retweeted_status,visible、geo、annotations,我就建幾個bean
他們是一對一的關系,user和statu、retweeted_status,是一對一,statu和statu、visible、geo、annotations一對一
,retweeted_status和visible、geo一對一關系。
利用反射處理,部分代碼如下:
得到set方法
Object b = jsonObject.get(k);
StringBuffer setM = new StringBuffer();
setM.append("set");
setM.append(k.substring(0, 1).toUpperCase());
setM.append(k.substring(1, k.length()));
Field field = userClass.getDeclaredField(k);
Method method = userClass.getMethod(setM.toString(),new Class[]{ field.getType() });
執行set方法:method.invoke(userObject, new Object[]{statusObject});
大致的思路是這樣的
F. mySQL中的JSON操作
創建單個json數組
創建單個對象,並返回該對象
將其他類型的值轉換成JSON類型來獲取json值
將 json 值作為參數傳入,如果值有效,則返回其 json 類型,否則報錯
將兩個或多個 json 值合並為一個 json 並返回最終值
合並兩個或多個 json 值,但不合並重祥譽脊復鍵的值,如果出現重復鍵,虛轎僅保留最後一個的值
經過函數轉換得到的 json 是區分大小寫的,原因在於轉換後的字元集格式為 utf8mb4 和 utf8mb4_bin ,因為 utf8mb4_bin 是二進制排序規則,所以區分大小寫
因為區分大小謹滲寫,所以 json 中的 null 、 true 和 false 都必須用小寫字母編寫
直接插入鍵值對語句和用 JSON_OBJECT 轉換成json值存入的差別在於,前者需要雙反斜杠轉義字元,而後者只需要單反斜杠轉義字元
當需要存儲的內容如下
使用直接插入的方法時:
使用 JSON_OBJECT 時
案例
因為 $[1] 和 $[2] 計算為非標量值, 所以它們可以用作選擇嵌套值的更具體的路徑表達式的基礎。例子:
結合 JSON_SET``JSON_INSERT``JSON_REPLACE``JSON_REMOVE 的使用
JSON_SET 替換存在的路徑的值, 並為不存在的路徑添加值
JSON_INSERT 添加新值, 但不替換現有值:
JSON_REPLACE 替換現有值並忽略新值:
JSON_REMOVE 使用一個或多個路徑, 這些路徑指定要從文檔中刪除的值。返回值是原始文檔減去由文檔中存在的路徑選擇的值: