添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
大力的砖头  ·  python onvif搜索 ip - ...·  5 月前    · 
痴情的啄木鸟  ·  java - SecureRandom: ...·  1 年前    · 
腼腆的柳树  ·  Spark 结构化API ...·  1 年前    · 
大力的饺子  ·  creator js pb ...·  1 年前    · 

百度了下发现在是Mysql5.7版本以后新增的功能,Mysql提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息。Json文本采用标准的创建方式,可以使用大多数的比较操作符进行比较操作,例如:=, <, <=, >, >=, <>, != 和 <=>。

MySQL JSON相关函数

MySQL官方列出json相关的函数,完整列表如下:

创建json json_array 创建json数组 json_object 创建json对象 json_quote 将json转成json字符串类型 查询json json_contains 判断是否包含某个json值 json_contains_path 判断某个路径下是否包json值 json_extract 提取json值 column->path json_extract的简洁写法,MySQL 5.7.9开始支持 column->>path json_unquote(column -> path)的简洁写法 json_keys 提取json中的键值为json数组 json_search 按给定字符串关键字搜索json,返回匹配的路径 修改json json_append 废弃,MySQL 5.7.9开始改名为json_array_append json_array_append 末尾添加数组元素,如果原有值是数值或json对象,则转成数组后,再添加元素 json_array_insert 插入数组元素 json_insert 插入值(插入新值,但不替换已经存在的旧值) json_merge 合并json数组或对象 json_remove 删除json数据 json_replace 替换值(只替换已经存在的旧值) json_set 设置值(替换旧值,并插入不存在的新值) json_unquote 去除json字符串的引号,将值转成string类型 返回json属性 json_depth 返回json文档的最大深度 json_length 返回json文档的长度 json_type 返回json值得类型 json_valid 判断是否为合法json文档

在Mysql5.7版本及之后的版本可以使用column->path作为JSON_EXTRACT(column, path)的快捷方式。这个函数可以作为列数据的别名出现在SQL语句中的任意位置,包括WHERE,ORDER BY,和GROUP BY语句。同样包含SELECT, UPDATE, DELETE,CREATE TABLE和其他SQL语句。->左边的参数为JSON数据的列名而不是一个表达式,其右边参数JSON数据中的某个路径表达式。

MySQL JOSN相关函数语法

一、创建JSON值的函数

JSON_ARRAY([val[, val] ...])

计算(可能为空)值列表并返回包含这些值的JSON数组。

mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());

JSON_QUOTE(string)

通过用双引号字符包装并转义内部引号和其他字符,然后将结果作为utf8mb4字符串返回,将字符串引用为JSON值 。NULL如果参数是,则 返回 NULL。

此函数通常用于生成有效的JSON字符串文字以包含在JSON文档中。

mysql> SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"');
  • 语法:

    JSON_CONTAINS(json_doc, val[, path])
    • 返回0或者1来表示目标JSON文本中是否包含特定值,或者JSON文本的指定路径下是否包含特定值。
    • 以下情况将返回NULL:
      • 目标JSON文本或者特定值为NULl
      • 指定路径非目标JSON文本下的路径
      • 以下情况将报错:
        • 目标JSON文本不合法
        • 指定路径不合法
        • 包含* 或者 ** 匹配符
        • 若仅检查路径是否存在,使用JSON_CONTAINS_PATH()代替
        • 这个函数中做了以下约定:
          • 当且仅当两个标量可比较而且相等时,约定目标表标量中包含候选标量。两个标量的JSON_TYPE()值相同时约定他们是可比较的,另外类型分别为INTEGER和DECEMAL的两个标量也是可比较的
          • 当且仅当目标数组中包含所有的候选数组元素,约定目标数组包含候选数组
          • 当且仅当目标数组中某些元素包含空数组,约定目标数组包含空数组
          • 当且仅当候选对象中所有的键值都能在目标对象中找到相同名称的键而且候选键值被目标键值包含,约定目标对象包含候选对象
          • 其他的情况均为目标文本不包含候选文本
          • mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
          • 语法:

            JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
            • 返回0或者1表示JSON文本的指定的某个路径或者某些路径下是否包含特定值。
            • 当某些参数为NULL是否返回NULL
            • 以下情况将报错:
              • 参数json_doc为不合法JSON文本
              • path参数中包含不合法的路径
              • one_or_all参数为非’one’或者’all’的值
              • 检测某个路径中是否包含某个特定值,使用 JSON_CONTAINS()代替
              • 目标文本中如果没有指定的路径,则返回0。否则,返回值依赖于one_or_all值:
                • ’one’: 文本中存在至少一个指定路径则返回1,否则返回0
                • ‘all’: 文本中包含所有指定路径则返回1, 否则返回0
                • mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
                • 语法:

                  JSON_EXTRACT(json_doc, path[, path] ...)
                  • 返回json_doc中与path参数相匹配的数据。当有参数为NULl或者文本中未找到指定path时将返回NULL。当参数不合法时将报错。
                  • 返回结果包含所有与path匹配的值。如果返回多个值,则将自动包装为数组,其顺序为匹配顺序;相反则返回单个匹配值。
                  • MySQL5.7.9及之后的版本将支持’->’操作符作为本函数两个参数时的便捷写法。->左边的参数为JSON数据的列名而不是一个表达式,其右边参数JSON数据中的某个路径表达式。详细使用方法将在文末详细阐述。
                  • mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');
                    • 语法:

                      CLOUMN->PATH(c->"$.id")
                      • 当与两个参数一起使用时, -> 运算符用作 JSON_EXTRACT() 函数的别名, 左边是列标识符,右边是JSON路径,根据JSON文档(列值)计算。您可以在SQL语句中的任何位置使用此类表达式代替列标识符
                      • 返回结果包含所有与path匹配的值。如果返回多个值,则将自动包装为数组,其顺序为匹配顺序;相反则返回单个匹配值。
                      • MySQL5.7.9及之后的版本将支持’->’操作符作为本函数两个参数时的便捷写法。->左边的参数为JSON数据的列名而不是一个表达式,其右边参数JSON数据中的某个路径表达式。详细使用方法将在文末详细阐述。
                      • SELECT 这里显示 的两个语句产生相同的输出:
                        mysql> SELECT c, JSON_EXTRACT(c, "$.id"), g

                        COLUMN->>PATH

                        这是一个改进的,不引用的提取操作符,可在MySQL 5.7.13及更高版本中使用。而 ->操作者简单地提取的值时, ->>在加法运算unquotes所提取的结果。换句话说,给定 JSON 列值 column和路径表达式 path,以下三个表达式返回相同的值:

                        JSON_UNQUOTE( JSON_EXTRACT(column, path) )

                        JSON_UNQUOTE(column -> path)

                        ->>只要JSON_UNQUOTE(JSON_EXTRACT())允许 ,操作员就可以使用 。这包括(但不限于) SELECT列表,WHERE和 HAVING条款,并ORDER BY和GROUP BY条款。

                        演示->>在mysql客户端中其他表达式的一些 运算符等价:

                        mysql> SELECT * FROM jemp WHERE g > 2;

                        JSON_SEARCH()

                      • 语法:

                        JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
                        • 返回JSON包含指定字符串的路径。
                        • 以下情况将返回NULL
                          • json_doc, search_str 或path 为NULL
                          • 文本中不包含path
                          • search_str未找到
                          • 以下情况将报错
                            • json_doc不合法
                            • path不合法
                            • one_or_all 不是one 或者all
                            • escape_char 不是一个常量表达式
                            • one_or_all的作用
                              • ’one’:当查找操作找到第一个匹配对象,并将结果路径返回后就停止查找。
                              • ‘all’:将返回所有的匹配结果路径,结果中不包含重复路径。如果返回结果集中包含多个字符串,将自动封装为一个数组,元素的排序顺序无意义。
                              • 在search_str中,通配符’%’和’‘可以如同LIKE操作上一样运行。’%’可以匹配多个字符(包括0个字符),’‘则仅可匹配一个字符。
                              • ‘%’或’_’作为特殊字符出现时,需要使用转义字符进行转义。当escape_char参数为NULL或者不存在的情况下,系统默认使用’\’作为转义字符。escape_char参数必须要常量(为空或者一个字符)
                              • 对于通配符的处理上与LIKE操作不同之处在于,JSON_SEARCH()中的通配符在编译时的计算结果必须要是常量,而不像LIKE仅需在执行时为常量。例如:在prepared Statement中使用JSON_SEARCH(), escape_char参数使用’?’作为参数,那么这个参数在执行时可能是常量,而不是在编译的时候。(这句话自己也没怎么懂,想了很久没想到该怎么翻译)
                              • mysql> SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';

                                JSON_APPEND(json_doc, path, val[, path, val] ...)

                                将值附加到JSON文档中指定数组的末尾并返回结果。这个函数 JSON_ARRAY_APPEND() 在MySQL 5.7.9中被重命名为; 该别名JSON_APPEND()现已在MySQL 5.7中弃用,并在MySQL 8.0中删除。

                              JSON_ARRAY_APPEND()

                              JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
                              • 在指定的数组末尾以JSON文本形式追加指定的值并返回。当参数中包含NULL时,返回NULL。
                              • 以下情况将报错
                                • json_doc不合法
                                • path 不合法
                                • 包含* 或者 ** 通配符
                                • 键值对采用自左到右的顺序进行追加。追加一对键值后的新值将成为下一对键值追加的目标。
                                • 如果指定目录下为标量或者对象值,则会被封装为数组,然后将新的值加入到数组中。对于不包含任何值得键值对将直接忽略。
                                • mysql> SET @j = '["a", ["b", "c"], "d"]';
                                • 语法:

                                  JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
                                  • 更新一个JSON文本,向文本中插入一个数组,然后返回修改后的文本。如果参数为NULL,则返回NULL。
                                  • 以下情况报错
                                    • json_doc参数不合法
                                    • path不合法
                                    • 包含 * 或者 ** 通配符
                                    • 不是以数组标示结尾
                                    • 键值对采用自左到右的顺序进行插入,插入一对后的新值将作为下一对插入的目标。
                                    • 对于不包含任何值得键值对将直接忽略。如果path指定的是一个数组元素,则其对应的值将插入到该元素右边的任意位置;如果path指定的是数组的末尾,则其值将插入到该数组末尾。
                                    • 执行插入操作后,其元素位置将发生变化,也将影响后续插入数据的位置定义。如最后的示例中,第二个插入数据并未出现数数据库中,是因为第一次插入操作后,原语句中定义的位置在新数据中未找到指定的元素,从而被忽略。
                                    • mysql> SET @j = '["a", {"b": [1, 2]}, [3, 4]]';

                                      较早的修改会影响数组中以下元素的位置,因此同一 JSON_ARRAY_INSERT() 调用中的后续路径 应考虑到这一点。在最后一个示例中,第二个路径不插入任何内容,因为路径在第一次插入后不再匹配任何内容。

                                    JSON_INSERT(json_doc, path, val[, path, val] ...)

                                    将数据插入JSON文档并返回结果。NULL如果有任何参数,则 返回NULL。如果发生错误 json_doc的参数是不是一个有效的JSON文档或任何path参数是不是有效的路径表达式或包含一个 *或**通配符。

                                    路径值对从左到右进行评估。通过评估一对产生的文档成为评估下一对的新值。

                                    将忽略文档中现有路径的路径值对,并且不会覆盖现有文档值。如果路径标识以下类型的值之一,则文档中不存在路径的路径值对会将值添加到文档中:

                                    不存在于现有对象中的成员。该成员将添加到对象并与新值关联。

                                    位于现有数组末尾的位置。该数组使用新值进行扩展。如果现有值不是数组,则将其作为数组自动包装,然后使用新值进行扩展。

                                    为了进行比较 JSON_INSERT() JSON_REPLACE() 以及 JSON_SET() ,看到的讨论 JSON_SET()

                                    否则,将忽略文档中不存在路径的路径 - 值对,但不起作用。

                                    mysql> SET @j = '{ "a": 1, "b": [2, 3]}';

                                    JSON_MERGE_PATCH(json_doc, json_doc[, json_doc] ...)

                                    执行 符合 RFC 7396 的两个或多个JSON文档的合并,并返回合并的结果,而不保留具有重复键的成员。如果至少有一个作为参数传递给此函数的文档无效,则引发错误。

                                    有关此函数与之间差异的解释和示例JSON_MERGE_PRESERVE(),请参阅与 JSON_MERGE_PRESERVE()相比较的JSON_MERGE_PATCH()

                                    JSON_MERGE_PATCH() 执行合并如下:

                                    如果第一个参数不是对象,则合并的结果与将空对象与第二个参数合并的结果相同。

                                    如果第二个参数不是对象,则合并的结果是第二个参数。

                                    如果两个参数都是对象,则合并的结果是具有以下成员的对象:

                                    第一个对象的所有成员没有在第二个对象中具有相同键的相应成员。

                                    第二个对象的所有成员在第一个对象中没有对应的键,其值不是JSON null文字。

                                    具有在第一个和第二个对象中存在的键的所有成员,并且其在第二个对象中的值不是JSON null 文字。这些成员的值是以递归方式将第一个对象中的值与第二个对象中的值合并的结果。

                                    JSON_MERGE_PATCH() MySQL 5.7.22及更高版本支持。

                                    JSON_MERGE_PATCH()与JSON_MERGE_PRESERVE()进行比较。  的行为JSON_MERGE_PATCH()是一样的是 JSON_MERGE_PRESERVE() ,有以下两种情况例外:

                                    JSON_MERGE_PATCH()使用第二个对象中的匹配键删除第一个对象中的任何成员,前提是与第二个对象中的键关联的值不是JSON null。

                                    如果第二个对象的成员具有与第一个对象中的成员匹配的键,则将第一个对象中 的值JSON_MERGE_PATCH() 替换为第二个对象中的值,而 JSON_MERGE_PRESERVE() 将第二个值附加到第一个值。

                                  此示例比较了将相同的3个JSON对象(每个对象具有匹配的密钥"a")与这两个函数中的每一个进行合并的结果:

                                  mysql> SET @x = '{ "a": 1, "b": 2 }',

                                  JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc] ...)

                                  合并两个或多个JSON文档并返回合并的结果。NULL如果有任何参数,则 返回NULL。如果任何参数不是有效的JSON文档,则会发生错误。

                                  合并根据以下规则进行。有关其他信息,请参阅 JSON值的规范化,合并和自动包装

                                  相邻阵列合并为单个阵列。

                                  相邻对象合并为单个对象。

                                  标量值作为数组自动包装并合并为数组。

                                  通过将对象自动包装为数组并合并两个数组来合并相邻的数组和对象

                                  mysql> SELECT JSON_MERGE_PRESERVE('[1, 2]', '[true, false]');

                                  这个函数在MySQL 5.7.22中作为同义词添加 JSON_MERGE() 。该 JSON_MERGE()函数现已弃用,并且将在MySQL的未来版本中删除。

                                  该功能与 JSON_MERGE_PATCH() 重要方面类似但不同 ; 有关详细信息,请参阅 JSON_MERGE_PATCH()与JSON_MERGE_PRESERVE() 进行比较。

                                JSON_REMOVE(json_doc, path[, path] ...)

                                从JSON文档中删除数据并返回结果。NULL如果有任何参数,则 返回NULL。如果json_doc参数不是有效的JSON文档或任何path参数不是有效的路径表达式或者是$或包含*或** 通配符,则会发生错误 。

                                该path参数进行评估从左到右。通过评估一条路径生成的文档将成为评估下一条路径的新值。

                                如果文档中不存在要删除的元素,则不是错误; 在这种情况下,路径不会影响文档。

                                mysql> SET @j = '["a", ["b", "c"], "d"]';

                                JSON_REPLACE(json_doc, path, val[, path, val] ...)

                                替换JSON文档中的现有值并返回结果。NULL如果有任何参数,则 返回NULL。如果发生错误 json_doc的参数是不是一个有效的JSON文档或任何path参数是不是有效的路径表达式或包含一个 *或**通配符。

                                路径值对从左到右进行评估。通过评估一对产生的文档成为评估下一对的新值。

                                文档中现有路径的路径值对使用新值覆盖现有文档值。文档中不存在路径的路径 - 值对将被忽略,并且不起作用。

                                为了进行比较 JSON_INSERT() JSON_REPLACE() 以及 JSON_SET() ,看到的讨论 JSON_SET()

                                mysql> SET @j = '{ "a": 1, "b": [2, 3]}';

                                JSON_SET(json_doc, path, val[, path, val] ...)

                                在JSON文档中插入或更新数据并返回结果。返回NULL如果任何参数是 NULL或path,如果给,不定位的对象。如果发生错误 json_doc的参数是不是一个有效的JSON文档或任何path参数是不是有效的路径表达式或包含一个 *或**通配符。

                                路径值对从左到右进行评估。通过评估一对产生的文档成为评估下一对的新值。

                                文档中现有路径的路径值对使用新值覆盖现有文档值。如果路径标识以下类型的值之一,则文档中不存在路径的路径值对会将值添加到文档中:

                                不存在于现有对象中的成员。该成员将添加到对象并与新值关联。

                                位于现有数组末尾的位置。该数组使用新值进行扩展。如果现有值不是数组,则将其作为数组自动包装,然后使用新值进行扩展。

                              否则,将忽略文档中不存在路径的路径 - 值对,但不起作用。

                              JSON_SET() JSON_INSERT() JSON_REPLACE() 功能的关系:

                              JSON_SET() 替换现有值并添加不存在的值。

                              JSON_INSERT() 插入值而不替换现有值。

                              JSON_REPLACE() 仅替换 现有值。

                            以下示例说明了这些差异,使用了文档($.a)中存在的一个路径和另一个不存在的路径($.c):

                            mysql> SET @j = '{ "a": 1, "b": [2, 3]}';

                            JSON_UNQUOTE(json_val)

                            取消引用JSON值并将结果作为utf8mb4字符串返回 。NULL如果参数是,则 返回 NULL。如果值以双引号结束但不是有效的JSON字符串文字,则会发生错误。

                            在字符串中,除非 NO_BACKSLASH_ESCAPES 启用S​​QL模式,否则某些序列具有特殊含义。这些序列中的每一个都以反斜杠(\)开头,称为 转义字符。MySQL识别 表12.21“JSON_UNQUOTE()特殊字符转义序列”中显示的转义序列 。对于所有其他转义序列,将忽略反斜杠。也就是说,转义字符被解释为好像它没有被转义。例如,\x就是x。这些序列区分大小写。例如, \b被解释为退格,但 \B被解释为B。

                            表12.21 JSON_UNQUOTE()特殊字符转义序列

                            由Sequence表示的字符 双引号(")字符 一个换文字符 换行符(换行符) 反斜杠(\)字符 \uXXXX Unicode值的UTF-8字节 XXXX

                            这里显示了使用此函数的两个简单示例:

                            mysql> SET @j = '"abc"';

                            四、返回JSON值属性的函数

                            JSON_DEPTH(json_doc)

                            返回JSON文档的最大深度。NULL如果参数是,则 返回 NULL。如果参数不是有效的JSON文档,则会发生错误。

                            空数组,空对象或标量值具有深度1.仅包含深度为1的元素的非空数组或仅包含深度为1的成员值的非空对象具有深度2.否则,JSON文档的深度大于2。

                            mysql> SELECTJSON_DEPTH('{}'), JSON_DEPTH('[]'), JSON_DEPTH('true');

                            JSON_LENGTH(json_doc[, path])

                            返回JSON文档的长度,或者,如果path给出参数,则返回 由路径标识的文档中的值的长度。返回NULL如果任何参数 NULL或path 参数不文档中确定的值。如果json_doc参数不是有效的JSON文档或 path参数不是有效的路径表达式或包含*或 **通配符,则会发生错误。

                            文件的长度确定如下:

                            标量的长度为1。

                            数组的长度是数组元素的数量。

                            对象的长度是对象成员的数量。

                            长度不计算嵌套数组或对象的长度。

                            mysql> SELECTJSON_LENGTH('[1, 2, {"a": 3}]');