В MySQL, JSON_STORAGE_FREE()
функцията показва колко място за съхранение е било освободено след актуализиране на JSON документ.
За стойност на колона JSON показва колко място за съхранение е било освободено в неговото двоично представяне, след като е било актуализирано на място с помощта на JSON_SET()
, JSON_REPLACE()
или JSON_REMOVE()
.
За JSON документ (или низ, който може да бъде анализиран като един), тази функция връща 0
.
Синтаксис
Синтаксисът е така:
JSON_STORAGE_FREE(json_val)
Където json_val
представлява JSON документа, за който да се върне количеството байтове, освободени след актуализация. Това може да бъде име на колона. Може също да бъде валиден JSON документ или низ, който може да бъде анализиран като един – или като буквална стойност, или като стойност на потребителска променлива – в този случай функцията връща 0
.
Пример
Изпълняваме заявка:
SELECT Contents FROM Collections WHERE CollectionId = 4;
И вземете следните данни:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Нека проверим размера на съхранение на Contents
колона и вижте дали някое място е било освободено от актуализация.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Резултат:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
В този случай данните заемат 40 байта място за съхранение и не е освободено място от никакви актуализации.
Но можем да променим това.
Нека направим актуализация.
UPDATE Collections SET Contents = JSON_SET(Contents, "$.Stupid", 1) WHERE CollectionId = 4;
Резултат:
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
Нека изпълним друга заявка, за да видим актуализираните данни.
SELECT Contents FROM Collections WHERE CollectionId = 4;
Резултат:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
Така че стойността "True"
е променен на 1
.
Сега нека видим колко място беше освободено с тази актуализация.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Резултат:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
Този резултат показва, че е възникнала частична актуализация на JSON документа и че това е освободило 5 байта място за съхранение. Резултатът, върнат от JSON_STORAGE_SIZE()
е непроменен от частичната актуализация.
Поддържат се частични актуализации за актуализации, използващи JSON_SET()
, JSON_REPLACE()
или JSON_REMOVE()
.
Нечастични актуализации
Директното присвояване на стойност на колона JSON не може да бъде частично актуализирано и следователно това ще доведе до отчитане на освободено място.
Същото важи и за потребителска променлива JSON.
Ето пример за демонстрация.
Първо задаваме променливата:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Резултат:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Сега актуализираме променливата с помощта на JSON_SET()
:
SET @data = JSON_SET(@data, "$.Stupid", 1); SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Резултат:
+------+------+ | Size | Free | +------+------+ | 35 | 0 | +------+------+
Така че в този случай не беше освободено място. Забележете обаче също, че JSON_STORAGE_SIZE()
функцията вече отчита по-малкия брой байтове (35), използвани за съхраняване на документа.