参数数据类型 varchar(max) 对于 Decompress 函数的参数 1 无效

Mon*_*RPG 5 c# sql-server compression gzip

我将字符串值保存GZIP到 SQL Server 2016VARCHAR(max)列中。

将字符串转换为GZIP形式是使用 C# 完成的。

示例值

This is my trial string
Run Code Online (Sandbox Code Playgroud)

生成的GZIP值

FwAAAB+LCAAAAAAABAALycgsVgCi3EqFkqLMxByFYiCVlw4AJnX75BcAAAA=
Run Code Online (Sandbox Code Playgroud)

是否可以选择从 SQL Server 解压缩后的值?

或者我必须将其解压到我的 C# 应用程序中吗?

我尝试过以下功能,但失败了。NVARCHAR(max)也尝试过

在此输入图像描述

我使用的gzip函数

public static string GZip_String(string text)
{
    using (var memoryStream = new MemoryStream())
    {
        byte[] buffer = Encoding.UTF8.GetBytes(text);
        using (var gZipStream = new GZipStream(memoryStream, System.IO.Compression.CompressionMode.Compress, true))
        {
            gZipStream.Write(buffer, 0, buffer.Length);
        }

        memoryStream.Position = 0;

        var compressedData = new byte[memoryStream.Length];
        memoryStream.Read(compressedData, 0, compressedData.Length);


        var gZipBuffer = new byte[compressedData.Length + 4];
        Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
        Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
        return Convert.ToBase64String(gZipBuffer);
    }
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*ill 4

解压缩函数适用于二进制数据,因此您可以尝试将字节存储在 varbinary 字段中。以下是它在纯 SQL 中的工作原理(尚未在 C# 中尝试过):

CREATE TABLE #tmp
(
    F1 varchar(100)
  , F2 varbinary(MAX)
);

INSERT INTO #tmp
(
    F1
  , F2
)
VALUES
    ('Hey there.'           -- F1 - varchar(100)
   , COMPRESS('Hey there.') -- F2 - varbinary(max)
    );

SELECT F1
     , F2
     , CAST(DECOMPRESS(F2) AS varchar(100))
  FROM #tmp;
Run Code Online (Sandbox Code Playgroud)