Trong MySQL, JSON_STORAGE_FREE()
hàm cho biết dung lượng lưu trữ đã được giải phóng sau khi cập nhật Tài liệu JSON.
Đối với giá trị cột JSON, nó cho biết lượng không gian lưu trữ đã được giải phóng trong biểu diễn nhị phân của nó sau khi được cập nhật tại chỗ bằng cách sử dụng JSON_SET()
, JSON_REPLACE()
hoặc JSON_REMOVE()
.
Đối với tài liệu JSON (hoặc một chuỗi có thể được phân tích cú pháp thành một), hàm này trả về 0
.
Cú pháp
Cú pháp như sau:
JSON_STORAGE_FREE(json_val)
Ở đâu json_val
đại diện cho tài liệu JSON để trả về số lượng byte được giải phóng sau khi cập nhật. Đây có thể là một tên cột. Nó cũng có thể là một tài liệu JSON hợp lệ hoặc một chuỗi có thể được phân tích cú pháp thành một — dưới dạng giá trị chữ hoặc dưới dạng giá trị của biến người dùng — trong trường hợp này, hàm trả về 0
.
Ví dụ
Chúng tôi chạy một truy vấn:
SELECT Contents FROM Collections WHERE CollectionId = 4;
Và lấy dữ liệu sau:
+-------------------------------------+ | Contents | +-------------------------------------+ | {"Name": "Homer", "Stupid": "True"} | +-------------------------------------+
Hãy kiểm tra kích thước lưu trữ của Contents
và xem liệu có bất kỳ dung lượng nào đã được giải phóng bằng bản cập nhật hay không.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Kết quả:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Trong trường hợp này, dữ liệu sử dụng hết 40 byte dung lượng lưu trữ và không có dung lượng nào được giải phóng bởi bất kỳ bản cập nhật nào.
Nhưng chúng ta có thể thay đổi điều đó.
Hãy cập nhật.
UPDATE Collections SET Contents = JSON_SET(Contents, "$.Stupid", 1) WHERE CollectionId = 4;
Kết quả:
Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0
Hãy chạy một truy vấn khác để xem dữ liệu được cập nhật.
SELECT Contents FROM Collections WHERE CollectionId = 4;
Kết quả:
+--------------------------------+ | Contents | +--------------------------------+ | {"Name": "Homer", "Stupid": 1} | +--------------------------------+
Vì vậy, giá trị "True"
đã được đổi thành 1
.
Bây giờ, hãy xem có bao nhiêu dung lượng đã được giải phóng với bản cập nhật đó.
SELECT JSON_STORAGE_SIZE(Contents) Size, JSON_STORAGE_FREE(Contents) Free FROM Collections WHERE CollectionId = 4;
Kết quả:
+------+------+ | Size | Free | +------+------+ | 40 | 5 | +------+------+
Kết quả này cho thấy rằng đã xảy ra cập nhật một phần tài liệu JSON và điều này giải phóng 5 byte dung lượng lưu trữ. Kết quả được trả về bởi JSON_STORAGE_SIZE()
không thay đổi bởi bản cập nhật một phần.
Cập nhật một phần được hỗ trợ cho các bản cập nhật bằng JSON_SET()
, JSON_REPLACE()
hoặc JSON_REMOVE()
.
Cập nhật không từng phần
Việc gán trực tiếp giá trị cho một cột JSON không thể được cập nhật một phần và do đó, điều này sẽ dẫn đến không có dung lượng giải phóng nào được báo cáo.
Điều này cũng đúng với biến người dùng JSON.
Đây là một ví dụ để chứng minh.
Đầu tiên, chúng tôi đặt biến:
SET @data = '{"Name": "Homer", "Stupid": "True"}'; SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Kết quả:
+------+------+ | Size | Free | +------+------+ | 40 | 0 | +------+------+
Bây giờ chúng tôi cập nhật biến bằng cách sử dụng JSON_SET()
:
SET @data = JSON_SET(@data, "$.Stupid", 1); SELECT JSON_STORAGE_SIZE(@data) Size, JSON_STORAGE_FREE(@data) Free;
Kết quả:
+------+------+ | Size | Free | +------+------+ | 35 | 0 | +------+------+
Vì vậy, trong trường hợp này không có không gian nào được giải phóng. Tuy nhiên, cũng lưu ý rằng JSON_STORAGE_SIZE()
bây giờ hàm báo cáo số byte thấp hơn (35) được sử dụng để lưu trữ tài liệu.