En MySQL, el JSON_STORAGE_FREE()
La función muestra cuánto espacio de almacenamiento se liberó después de actualizar un documento JSON.
Para un valor de columna JSON, muestra cuánto espacio de almacenamiento se liberó en su representación binaria después de actualizarse usando JSON_SET()
, JSON_REPLACE()
o JSON_REMOVE()
.
Para un documento JSON (o una cadena que se puede analizar como tal), esta función devuelve 0
.
Sintaxis
La sintaxis es así:
JSON_STORAGE_FREE(json_val)
Donde json_val
representa el documento JSON para el que devolver la cantidad de bytes liberados después de una actualización. Esto puede ser un nombre de columna. También puede ser un documento JSON válido o una cadena que se puede analizar como uno, ya sea como un valor literal o como el valor de una variable de usuario, en cuyo caso la función devuelve 0
.
Ejemplo
Ejecutamos una consulta:
SELECT Contents FROM Collections WHERE CollectionId = 4;
Y obtén los siguientes datos:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Verifiquemos el tamaño de almacenamiento del Contents
y vea si se ha liberado espacio con una actualización.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Resultado:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
En este caso, los datos utilizan hasta 40 bytes de espacio de almacenamiento y ninguna actualización ha liberado espacio.
Pero podemos cambiar eso.
Hagamos una actualización.
UPDATE Collections SET Contents = JSON_SET(Contents, "$.Stupid", 1) WHERE CollectionId = 4;
Resultado:
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
Ejecutemos otra consulta para ver los datos actualizados.
SELECT Contents FROM Collections WHERE CollectionId = 4;
Resultado:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
Entonces el valor "True"
se ha cambiado a 1
.
Ahora veamos cuánto espacio se liberó con esa actualización.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Resultado:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
Este resultado muestra que se produjo una actualización parcial del documento JSON y que esto liberó 5 bytes de espacio de almacenamiento. El resultado devuelto por JSON_STORAGE_SIZE()
no ha cambiado por la actualización parcial.
Las actualizaciones parciales son compatibles con las actualizaciones que usan JSON_SET()
, JSON_REPLACE()
o JSON_REMOVE()
.
Actualizaciones no parciales
La asignación directa de un valor a una columna JSON no se puede actualizar parcialmente y, por lo tanto, no se informará sobre el espacio liberado.
Lo mismo se aplica a una variable de usuario JSON.
Aquí hay un ejemplo para demostrarlo.
Primero configuramos la variable:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Resultado:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Ahora actualizamos la variable usando JSON_SET()
:
SET @data = JSON_SET(@data, "$.Stupid", 1); SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Resultado:
+------+------+ | Size | Free | +------+------+ | 35 | 0 | +------+------+
Entonces, en este caso, no se liberó espacio. Sin embargo, también observe que JSON_STORAGE_SIZE()
La función ahora informa el número más bajo de bytes (35) utilizados para almacenar el documento.