DECOMPRESS: примеры (SQL)

Распаковка данных с помощью функции DECOMPRESS в SQL Server
Раздел: Функции сжатия данных
DECOMPRESS(expression): varbinary(max)

Основные сведения о функции DECOMPRESS

Функция DECOMPRESS в MS SQL Server предназначена для распаковки данных, которые были сжаты с помощью функции COMPRESS. Она принимает входной аргумент в формате varbinary(max), содержащий сжатые данные, и возвращает распакованные данные также в виде varbinary(max). Если входное значение равно NULL, функция возвращает NULL.

Аргумент функции является обязательным и представляет собой выражение, возвращающее данные типа varbinary(n | max). Функция использует алгоритм сжатия GZIP. Возвращаемое значение всегда имеет тип varbinary(max). Если переданные данные не являются корректными сжатыми данными, результатом может быть ошибка или некорректные данные.

Простые примеры использования

Пример сжатия строки и её последующей распаковки.

DECLARE @compressed_data varbinary(max) = COMPRESS(N'Пример текста для сжатия в SQL Server.');
SELECT
@compressed_data AS compressed,
DECOMPRESS(@compressed_data) AS decompressed_raw,
CAST(DECOMPRESS(@compressed_data) AS nvarchar(max)) AS decompressed_text;
compressed          | decompressed_raw                                 | decompressed_text
--------------------|---------------------------------------------------|----------------------------------------
0x1F8B0800... | 0x45004E00... (бинарные данные) | Пример текста для сжатия в SQL Server.

Работа с NULL значением.

SELECT DECOMPRESS(NULL) AS result;
result
------
NULL

Похожие функции в MS SQL

Основной парной функцией для DECOMPRESS является COMPRESS, которая выполняет сжатие данных. Для преобразования бинарных данных обратно в строку часто применяется функция CAST или CONVERT. В сценариях, требующих шифрования, а не сжатия, используются функции ENCRYPTBYKEY и DECRYPTBYKEY. Выбор между сжатием и шифрованием зависит от задачи: сжатие уменьшает объем данных, шифрование обеспечивает конфиденциальность.

Аналоги в других системах

MySQL: функции COMPRESS() и UNCOMPRESS(). Работают аналогично, но используют алгоритм LZ77.

SELECT UNCOMPRESS(COMPRESS('текст')) AS result;
result
------
текст

PostgreSQL: модуль pgcrypto или функции для работы со сжатием, например, pgp_sym_decrypt для шифрования. Прямого аналога DECOMPRESS нет, но можно использовать функции для работы с GZIP через расширения.

Oracle: пакет UTL_COMPRESS с процедурами lz_uncompress. Синтаксис отличается.

SELECT UTL_COMPRESS.LZ_UNCOMPRESS(сжатые_данные) FROM DUAL;

SQLite: встроенных функций сжатия нет, требуются пользовательские расширения.

Распространенные ошибки

Передача данных, которые не были сжаты с помощью COMPRESS, приводит к ошибке или возврату некорректных данных.

SELECT CAST(DECOMPRESS(CAST('не сжатые данные' AS varbinary(max))) AS nvarchar(max));
Может вернуть NULL или искаженную строку, в зависимости от данных.

Попытка распаковать пустую строку или данные в неверном формате.

SELECT DECOMPRESS(0x00) AS result;
Может вызвать ошибку или вернуть неопределенное значение.

История изменений функции

Функция DECOMPRESS была добавлена в MS SQL Server начиная с версии 2016 (13.x). В более поздних версиях, таких как SQL Server 2019 и 2022, существенных изменений в синтаксисе или поведении функции не произошло. Поддержка сжатия данных с использованием алгоритма GZIP остается неизменной.

Расширенные примеры применения

Использование функции для хранения и извлечения сжатых данных в таблице.

Пример sql
CREATE TABLE Documents (
Id int IDENTITY PRIMARY KEY,
Content_Compressed varbinary(max)
);

INSERT INTO Documents (Content_Compressed)
VALUES (COMPRESS(N'Большой текстовый документ, который требуется сжать.'));

SELECT
Id,
CAST(DECOMPRESS(Content_Compressed) AS nvarchar(max)) AS Content
FROM Documents;
Id | Content
---|-------------------------------------------------------
1 | Большой текстовый документ, который требуется сжать.

Сжатие и распаковка данных JSON перед их обработкой.

Пример sql
DECLARE @json_data nvarchar(max) = N'{"key": "value", "array": [1,2,3]}';
DECLARE @compressed_json varbinary(max) = COMPRESS(@json_data);

SELECT
@json_data AS original,
DATALENGTH(@json_data) AS original_size,
DATALENGTH(@compressed_json) AS compressed_size,
CAST(DECOMPRESS(@compressed_json) AS nvarchar(max)) AS restored_json;
original                         | original_size | compressed_size | restored_json
---------------------------------|---------------|-----------------|-------------------------------
{"key": "value", "array": [1,2,3]} | 46 | 62 | {"key": "value", "array": [1,2,3]}

Обработка NULL и проверка на сжатие с помощью TRY_CAST.

Пример sql
SELECT 
DECOMPRESS(NULL) AS null_result,
CASE
WHEN TRY_CAST(DECOMPRESS(0x1F8B0800000000000000) AS nvarchar(max)) IS NULL
THEN 'Неверные сжатые данные'
ELSE 'Данные распакованы'
END AS validation_check;
null_result | validation_check
------------|-------------------
NULL | Неверные сжатые данные

MS SQL DECOMPRESS function comments

En
DECOMPRESS Decompresses the input expression (GZIP algorithm)