No MySQL, o
JSON_STORAGE_FREE()
A função mostra quanto espaço de armazenamento foi liberado após a atualização de um documento JSON. Para um valor de coluna JSON, ele mostra quanto espaço de armazenamento foi liberado em sua representação binária depois que foi atualizado no local usando
JSON_SET()
, JSON_REPLACE()
, ou JSON_REMOVE()
. Para um documento JSON (ou uma string que pode ser analisada como uma), esta função retorna
0
. Sintaxe
A sintaxe fica assim:
JSON_STORAGE_FREE(json_val)
Onde
json_val
representa o documento JSON para o qual retornar a quantidade de bytes liberados após uma atualização. Este pode ser um nome de coluna. Também pode ser um documento JSON válido ou uma string que pode ser analisada como um - como um valor literal ou como o valor de uma variável do usuário - nesse caso, a função retorna 0
. Exemplo
Executamos uma consulta:
SELECT Contents FROM Collections WHERE CollectionId = 4;
E obtenha os seguintes dados:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Vamos verificar o tamanho do armazenamento do
Contents
coluna e veja se algum espaço foi liberado por uma atualização. SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Resultado:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Nesse caso, os dados usam até 40 bytes de espaço de armazenamento e nenhum espaço foi liberado por nenhuma atualização.
Mas podemos mudar isso.
Vamos fazer uma atualização.
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
Vamos executar outra consulta para ver os dados atualizados.
SELECT Contents FROM Collections WHERE CollectionId = 4;
Resultado:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
Portanto, o valor
"True"
foi alterado para 1
. Agora vamos ver quanto espaço foi liberado com essa atualização.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Resultado:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
Esse resultado mostra que ocorreu uma atualização parcial do documento JSON e que isso liberou 5 bytes de espaço de armazenamento. O resultado retornado por
JSON_STORAGE_SIZE()
é inalterado pela atualização parcial. Atualizações parciais são suportadas para atualizações usando
JSON_SET()
, JSON_REPLACE()
, ou JSON_REMOVE()
. Atualizações não parciais
A atribuição direta de um valor a uma coluna JSON não pode ser parcialmente atualizada e, portanto, isso resultará em nenhum espaço liberado sendo relatado.
O mesmo vale para uma variável de usuário JSON.
Aqui está um exemplo para demonstrar.
Primeiro vamos definir a variável:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Resultado:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Agora atualizamos a variável 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 | +------+------+
Portanto, neste caso, nenhum espaço foi liberado. No entanto, observe também que o
JSON_STORAGE_SIZE()
A função agora relata o menor número de bytes (35) usado para armazenar o documento.