首页 MySQL JSON_STORAGE_FREE() 函数

MySQL JSON_STORAGE_FREE() 函数

MySQL JSON_STORAGE_FREE() 函数返回一个 JSON 列在被 JSON_SET()JSON_REPLACE()JSON_REMOVE() 更新后所释放的空间。

JSON_STORAGE_FREE() 语法

这里是 MySQL JSON_STORAGE_FREE() 的语法:

JSON_STORAGE_FREE(json)

参数

json
必需的。一个 JSON 文档。它可以是一个 JSON 字符串,或者一个 JSON 列。

返回值

MySQL JSON_STORAGE_FREE() 函数返回一个 JSON 列在被 JSON_SET()JSON_REPLACE()JSON_REMOVE() 更新后所释放的空间。它可以接受一个 JSON 字符串,或者一个 JSON 列作为参数。

如果参数是一个 JSON 字符串,JSON_STORAGE_FREE() 函数返回 0

如果参数是一个 JSON 列,JSON_STORAGE_FREE() 函数按如下规则返回:

  • 如果列被 JSON_SET()JSON_REPLACE()JSON_REMOVE() 部分更新,它返回更新后释放的空间。
  • 如果列没有被更新过,或者不是使用 JSON_SET()JSON_REPLACE()JSON_REMOVE() 部分更新,它返回 0.
  • 如果列的内容在更新后变的更大了,它返回 0.

如果参数为 NULlJSON_STORAGE_FREE() 函数返回 NULL

如果参数 json 不是有效的 JSON 文档,MySQL 将会给出错误。您可以使用 JSON_VALID() 验证 JSON 文档的有效性。

JSON_STORAGE_FREE() 示例

本示例说明了 JSON_STORAGE_FREE() 的用法,以及它和 JSON_STORAGE_SIZE() 的区别。

首先,让我们先创建一个表 test_json_storage_free

DROP TABLE IF EXISTS test_json_storage_free;
CREATE TABLE test_json_storage_free (
    json_col JSON NOT NULL
);

然后,让我们插入 1 行数据以供测试使用:

INSERT INTO test_json_storage_free
VALUES ('{"x": 1, "y": "abcd"}');

然后,让我们看一下 JSON_STORAGE_SIZE()JSON_STORAGE_FREE() 的返回值:

SELECT
    json_col,
    JSON_STORAGE_SIZE(json_col) AS JSON_STORAGE_SIZE,
    JSON_STORAGE_FREE(json_col) AS JSON_STORAGE_FREE
FROM
    test_json_storage_free;
+-----------------------+-------------------+-------------------+
| json_col              | JSON_STORAGE_SIZE | JSON_STORAGE_FREE |
+-----------------------+-------------------+-------------------+
| {"x": 1, "y": "abcd"} |                26 |                 0 |
+-----------------------+-------------------+-------------------+

我们可以看到,由于数据刚刚插入,也未进行任何更新,因此 JSON_STORAGE_FREE() 函数返回了 0,而 JSON_STORAGE_SIZE 函数返回了占用的空间。

接着,让我们修改一下 JSON 列的值:

UPDATE test_json_storage_free
SET json_col = '{"x": 1, "y": "abcd", "z": 3}';

然后,让我们看一下 JSON_STORAGE_SIZE()JSON_STORAGE_FREE() 的返回值:

SELECT
    json_col,
    JSON_STORAGE_SIZE(json_col) AS JSON_STORAGE_SIZE,
    JSON_STORAGE_FREE(json_col) AS JSON_STORAGE_FREE
FROM
    test_json_storage_free;
+-------------------------------+-------------------+-------------------+
| json_col                      | JSON_STORAGE_SIZE | JSON_STORAGE_FREE |
+-------------------------------+-------------------+-------------------+
| {"x": 1, "y": "abcd", "z": 3} |                34 |                 0 |
+-------------------------------+-------------------+-------------------+

我们可以看到,由于 json_col 列的内容变了,因此 JSON_STORAGE_SIZE() 返回值发生了变化。但是 JSON_STORAGE_FREE() 函数仍然返回了 0,这是因为没有使用 JSON_SET()JSON_REPLACE()JSON_REMOVE() 更新 json_col 列。

然后,让我们使用 JSON_REMOVE() 删除 json_col 列中的成员 z

UPDATE test_json_storage_free
SET json_col = JSON_REMOVE(json_col, '$.z');

然后,让我们看一下 JSON_STORAGE_SIZE()JSON_STORAGE_FREE() 的返回值:

SELECT
    json_col,
    JSON_STORAGE_SIZE(json_col) AS JSON_STORAGE_SIZE,
    JSON_STORAGE_FREE(json_col) AS JSON_STORAGE_FREE
FROM
    test_json_storage_free;
+-----------------------+-------------------+-------------------+
| json_col              | JSON_STORAGE_SIZE | JSON_STORAGE_FREE |
+-----------------------+-------------------+-------------------+
| {"x": 1, "y": "abcd"} |                34 |                 8 |
+-----------------------+-------------------+-------------------+

我们可以看到,由于使用 JSON_REPLACE() 更新了 json_col 列的内容,因此 JSON_STORAGE_FREE() 函数返回了 8

特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。