MySQL支持JSON数据类型。相比于Json格式的字符串类型,JSON数据类型的优势有:
存储在JSON列中的任何JSON文档的大小都受系统变量 max_allowed_packet 的值的限制,可以使用 JSON_STORAGE_SIZE() 函数获得存储JSON文档所需的空间。
在MySQL80中,优化器可以执行JSON列的局部就地更新,而不用删除旧文档再将整个新文档写入该列。局部更新的条件:
JSON数组包含在 字符 [ 和 ] 字符中,其中为一个由逗号分隔的值列表:
JSON对象包含在字符 { 和 } 字符中,其中为一组由逗号分隔的键值对,键必须是字符串:
在JSON数组和JSON对象的值中允许嵌套:
下例中向创建一个只有一个JSON列的表格 t_json ,并向其中添加JSON值:
若添加的值为非JSON格式,则报错:
查看 t_json :
如果传入的参数不能组成键值对,则报错:
因此我们也可以使用以上三种方法向表中添加JSON值,可以一定程度地避免输入格式错误:
解析字符串并发现字符串是有效的JSON文档时,它在被解析时也会被规范化。对于重复的键( key ),后面的值( value )会覆盖前面的值。如下:
这种“覆盖”在向JSON列添加值时也会发生。
在MySQL803之前的版本中,与此相反,对于被重复的键,它的第一个值会被保留,后添加的值则会被抛弃。
MySQL803及更高版本中,有两种合并函数: JSON_MERGE_PRESERVE() 和 JSON_MERGE_PATCH() 。下面具讨论它们的区别。
合并数组时, JSON_MERGE_PRESERVE 只保留最后传入的数组参数,而 JSON_MERGE_PRESERVE 则按传入顺序将数组参数连接。
合并对象时,对于重复键, JSON_MERGE_PRESERVE 只保留最后传入的键值,而 JSON_MERGE_PRESERVE 重复键的所有值保留为数组。
在了解搜索和修改JSON值之前,先来看看JSON的路径语法。
JSON_EXTRACT 提取JSON值,直接看例子:
JSON_REPLACE 与 JSON_SET 的区别:
JSON_INSERT 和 JSON_SET :
JSON_REMOVE :
可以使用 = , < , <= , > , >= , <> , != ,和 <=> 对JSON值进行比较。
JSON值的比较先比较值的类型。如果类型不同,则直接 返回类型的优先级的比较结果;如果类型相同,再进行值的内容的比较。
OPAQUE 值是不属于其他类型的值。
转换规则为:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 40 Transitional//EN">
2 <HTML>
3 <HEAD>
4 <TITLE> New Document </TITLE>
5
6 <SCRIPT LANGUAGE="JavaScript">
7
8 var t="{'firstName': 'cyra', 'lastName': 'richardson', 'address': { 'streetAddress': '1 Microsoft way', 'city': 'Redmond', 'state': 'WA', 'postalCode': 98052 },'phoneNumbers': [ '425-777-7777','206-777-7777' ] }";
9 var jsonobj=eval('('+t+')');
10 alert(jsonobjfirstName);
11 alert(jsonobjlastName);
12
13 var t2="[{name:'zhangsan',age:'24'},{name:'lisi',age:'30'},{name:'wangwu',age:'16'},{name:'tianqi',age:'7'}] ";
14 var myobj=eval(t2);
15 for(var i=0;i<myobjlength;i++){
16 alert(myobj[i]name);
17 alert(myobj[i]age);
18 }
19
20 var t3="[['<a href=# onclick=openLink(14113295100,社旗县国税局桥头税务所,14113295100,d6d223892dc94f5bb501d4408a68333d,swjg_dm);>14113295100</a>','社旗县国税局桥头税务所','社旗县城郊乡长江路西段']]";
21 //通过eval() 函数可以将JSON字符串转化为对象
22 var obj = eval(t3);
23 for(var i=0;i<objlength;i++){
24 for(var j=0;j<obj[i]length;j++){
25 alert(obj[i][j]);
26 }
27 }
28
29
30 /
31 //stringifier 函数的作用跟 parse 相反, 用来将一个js对象转换为 JSON 文本。
32 var jsonText = JSONstringify(obj);
33 alert(jsonText);
34 //如果基于安全的考虑的话,最好是使用一个 JSON 解析器。 一个 JSON 解析器将只接受 JSON 文本。所以是更安全的。
35 var myObject = JSONparse(myJSONtext, filter);
36 //可选的 filter 参数将遍历每一个value key 值对, 并进行相关的处理。如:
37 //如
38 myData = JSONparse(text, function (key, value) {
39 return keyindexOf('date') >= 0 new Date(value) : value; });
40
41 //stringifier 函数的作用跟 parse 相反, 用来将一个js对象转换为 JSON 文本。
42 var myJSONText = JSONstringifier(myObject);
43 /
44
45 </SCRIPT>
46 </HEAD>
47 <BODY>
48 </BODY>
49 </HTML>
数据库只是用来存储数据的,为什么不把处理数据的部分放在后台?
在这里你需要了解以下几个知识点。
在sqlserver 中存储json ,需要用字符串类型进行存储,一般用nvarchar()或 varchar()进行存储。
openJson:打开Json字符串
IsJson:判断一个字符串是不是合法的Json格式。是返回1,否返回0,null返回null。
Json_Value:从Json字符串中提取值。
Json_Query:Json字符串中提取对象或数组。
Json_Modify:更新Json字符串中的属性值,并返回更新的Json字符串
然后参考的需求,获取输入key值中的value字段可以得到如下sql语句。
从JSON中获取输入B的JSON对象
SELECT JSON_QUERY(json, CONCAT('$',key)) INTO K_VAL;
从B的JSON对象中,获取value字段的值
SELECT JSON_VALUE(K_VAL, '$value') INTO JSONVALUE;
最终我们的声明的函数大概是:
CREATE FUNCTION PARSEJSON(json VARCHAR(2000), key VARCHAR(200))
RETURNS VARCHAR
BEGIN
declare JSONVALUE VARCHAR;
declare K_VAL VARCHAR;
SELECT JSON_QUERY(json, CONCAT('$',key)) INTO K_VAL;
SELECT JSON_VALUE(K_VAL, '$value') INTO JSONVALUE;
return JSONVALUE;
END
一个JSON相同类型数组表示的是一组具有相同数据类型的数据对象。常见的JSON数组形式如下:[{“name”:“jane”, “age”:20},{“name”:“mike”, “age”:25}]。
普通的json数组。
由于json中的所有引号必须使用双引号,但又不能双引号里包含双引号,所以上面的第一个例子都必须使用\转义。 第三个元素是一个字符串 ,需要对原数组json_decode之后在对第三个元素json_decode。
json数组里嵌入json对象
普通的json对象
乍一看像是Json对象里包了一个json数组,仔细看其实第三个元素是一个字符串,这个整体还是一个json对象。
json对象套json数组
JSON数组包含一个由逗号分隔的值列表,并包含在 字符[和]字符中:
JSON对象包含一组由逗号分隔的键值对,并包含在字符{和 }字符中,JSON对象中的键必须是字符串:
在JSON数组元素和JSON对象键值中允许嵌套:
在MySQL中,JSON值被写为字符串。MySQL解析在需要JSON值的上下文中使用的任何字符串,如果它作为JSON无效则会产生错误。
1JSON_ARRAY 生成json数组
JSON_ARRAY(val1,val2,val3)生成一个包含指定元素的json数组。
2JSON_OBJECT 生成json对象
JSON_OBJECT(key1,val1,key2,val2) 生成一个包含指定K-V对的json object。如果有key为NULL或参数个数为奇数,则抛错。
3JSON_QUOTE 加"号
JSON_QUOTE(json_val) -- 将json_val用"号括起来。
2插入记录
创建一个表
插入含有json数组的记录
插入含有json对象的记录
路径表达式对于提取JSON文档的一部分或修改JSON文档的函数很有用,以指定该文档中的 *** 作位置。例如,以下查询从JSON文档中提取具有 name 键的成员的值 :
路径语法使用前导 $ 字符来表示正在考虑的JSON文档,可选地后跟选择器,它们连续指示文档的更多特定部分:
如果路径表达式中的未加引号的键名称不合法,则必须引用命名键的路径组件。让我们 $ 参考这个值,且密钥都包含空格,必须引用:
可以使用带有 to 关键字的范围来指定JSON数组的子集。
last关键字被支撑为最后一个元素的阵列中的索引的同义词。表单的表达式可用于相对寻址,也可用于范围定义,如下所示: last - N
4JSON_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 两个字符串的第一个 字节相同,则认为较短的字符串小于较长的字符串。
以上就是关于MySQL JSON类型全部的内容,包括:MySQL JSON类型、JS解析json数据(如何将json字符串转化为数组)、求一个数据库函数解析json 如下图要求等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)