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
.
如果参数为 NULL
, JSON_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
。