MySQL支持JSON數(shù)據(jù)類型。相比于Json格式的字符串類型,JSON數(shù)據(jù)類型的優(yōu)勢有:
成都創(chuàng)新互聯(lián)公司是專業(yè)的滄縣網(wǎng)站建設公司,滄縣接單;提供網(wǎng)站設計、成都網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行滄縣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
存儲在JSON列中的任何JSON文檔的大小都受系統(tǒng)變量 max_allowed_packet 的值的限制,可以使用 JSON_STORAGE_SIZE() 函數(shù)獲得存儲JSON文檔所需的空間。
在MySQL8.0中,優(yōu)化器可以執(zhí)行JSON列的局部就地更新,而不用刪除舊文檔再將整個新文檔寫入該列。局部更新的條件:
JSON數(shù)組包含在 字符 [ 和 ] 字符中,其中為一個由逗號分隔的值列表:
JSON對象包含在字符 { 和 } 字符中,其中為一組由逗號分隔的鍵值對,鍵必須是字符串:
在JSON數(shù)組和JSON對象的值中允許嵌套:
下例中向創(chuàng)建一個只有一個JSON列的表格 t_json ,并向其中添加JSON值:
若添加的值為非JSON格式,則報錯:
查看 t_json :
如果傳入的參數(shù)不能組成鍵值對,則報錯:
因此我們也可以使用以上三種方法向表中添加JSON值,可以一定程度地避免輸入格式錯誤:
解析字符串并發(fā)現(xiàn)字符串是有效的JSON文檔時,它在被解析時也會被規(guī)范化。對于重復的鍵( key ),后面的值( value )會覆蓋前面的值。如下:
這種“覆蓋”在向JSON列添加值時也會發(fā)生。
在MySQL8.0.3之前的版本中,與此相反,對于被重復的鍵,它的第一個值會被保留,后添加的值則會被拋棄。
MySQL8.0.3及更高版本中,有兩種合并函數(shù): JSON_MERGE_PRESERVE() 和 JSON_MERGE_PATCH() 。下面具討論它們的區(qū)別。
合并數(shù)組時, JSON_MERGE_PRESERVE 只保留最后傳入的數(shù)組參數(shù),而 JSON_MERGE_PRESERVE 則按傳入順序將數(shù)組參數(shù)連接。
合并對象時,對于重復鍵, JSON_MERGE_PRESERVE 只保留最后傳入的鍵值,而 JSON_MERGE_PRESERVE 重復鍵的所有值保留為數(shù)組。
在了解搜索和修改JSON值之前,先來看看JSON的路徑語法。
JSON_EXTRACT 提取JSON值,直接看例子:
JSON_REPLACE 與 JSON_SET 的區(qū)別:
JSON_INSERT 和 JSON_SET :
JSON_REMOVE :
可以使用 = , , = , , = , , != ,和 = 對JSON值進行比較。
JSON值的比較先比較值的類型。如果類型不同,則直接 返回類型的優(yōu)先級的比較結果;如果類型相同,再進行值的內容的比較。
OPAQUE 值是不屬于其他類型的值。
轉換規(guī)則為:
用sql還真的可以,大概是這樣:
explain format=json select * from users where userid=1\G
下面是這個語句的語法要求:
MySQL數(shù)據(jù)庫:5.7.20-log MySQL Community Server (GPL)
名詞:
QEP: Query Execution Plan,查詢執(zhí)行計劃。
語法:
EXPLAIN [explain_type] {explainable_stmt }
explain_type:
{ EXTENDED | PARTITIONS | FORMAT = format_name}
format_name:
{ TRADITIONAL | JSON}
explainable_stmt:
{ SELECT statement | DELETE statement | INSERT statement | REPLACE statement | UPDATE statement }
這個在知道里就有,你還可以再看看:
$list=array("amount"=$row['amount']);
echo json_encode($list);
mysql版本:mysql 8
直接將id轉換成json數(shù)組,輸出格式[id1,id2,.....]
直接將id轉換成JSON對象數(shù)組數(shù)組,輸出格式[{id:'1',name:'name1'},{id:'2',name:'name2'},.....]
對比倆個json,如果有一個鍵值對或者數(shù)組元素則返回true,否則返回false
非必須要轉換類型后在判斷
執(zhí)行結果
參考地址
mysql-doc-8.0-api
業(yè)務場景
正確寫法
JSON數(shù)組包含一個由逗號分隔的值列表,并包含在 字符[和]字符中:
JSON對象包含一組由逗號分隔的鍵值對,并包含在字符{和 }字符中,JSON對象中的鍵必須是字符串:
在JSON數(shù)組元素和JSON對象鍵值中允許嵌套:
在MySQL中,JSON值被寫為字符串。MySQL解析在需要JSON值的上下文中使用的任何字符串,如果它作為JSON無效則會產(chǎn)生錯誤。
1.JSON_ARRAY 生成json數(shù)組
JSON_ARRAY(val1,val2,val3...)生成一個包含指定元素的json數(shù)組。
2.JSON_OBJECT 生成json對象
JSON_OBJECT(key1,val1,key2,val2...) 生成一個包含指定K-V對的json object。如果有key為NULL或參數(shù)個數(shù)為奇數(shù),則拋錯。
3.JSON_QUOTE 加"號
JSON_QUOTE(json_val) -- 將json_val用"號括起來。
2.插入記錄
創(chuàng)建一個表
插入含有json數(shù)組的記錄
插入含有json對象的記錄
路徑表達式對于提取JSON文檔的一部分或修改JSON文檔的函數(shù)很有用,以指定該文檔中的操作位置。例如,以下查詢從JSON文檔中提取具有 name 鍵的成員的值 :
路徑語法使用前導 $ 字符來表示正在考慮的JSON文檔,可選地后跟選擇器,它們連續(xù)指示文檔的更多特定部分:
如果路徑表達式中的未加引號的鍵名稱不合法,則必須引用命名鍵的路徑組件。讓我們 $ 參考這個值,且密鑰都包含空格,必須引用:
可以使用帶有 to 關鍵字的范圍來指定JSON數(shù)組的子集。
last關鍵字被支撐為最后一個元素的陣列中的索引的同義詞。表單的表達式可用于相對尋址,也可用于范圍定義,如下所示: last - * N *
4.JSON_REMOVE()獲取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 DATETIME 和 TIMESTAMP 類型,則它們相等,如果它們代表相同的時間點。
3)TIME
兩個時間值中較小的一個在較大的值之前排序。
4) DATE`
較早的日期是在最近的日期之前訂購的。
5) ARRAY
如果兩個JSON數(shù)組具有相同的長度并且數(shù)組中相應位置的值相等,則它們是相等的。如果數(shù)組不相等,則它們的順序由第一個位置中存在差異的元素確定。首先排序在該位置具有較小值的數(shù)組。如果較短數(shù)組的所有值都等于較長數(shù)組中的相應值,則首先排序較短的數(shù)組。
8) STRING
字符串在被比較的兩個字符串以詞法字典序排序 ,其中 N 是較短字符串的長度。如果 N 兩個字符串的第一個 字節(jié)相同,則認為較短的字符串小于較長的字符串。