MySQL JSON类型

MySQL JSON类型,第1张

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 如下图要求等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9672843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存