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

时间:2017-03-16 11:43:13

标签: c# sql-server gzip compression

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

使用C#将字符串转换为GZIP形式。

示例值

This is my trial string

产生的GZIP值

FwAAAB+LCAAAAAAABAALycgsVgCi3EqFkqLMxByFYiCVlw4AJnX75BcAAAA=

是否可以从SQL Server中解压缩选择此值?

或者我必须在C#应用程序中解压缩它吗?

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

enter image description here

我使用的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);
    }
}

2 个答案:

答案 0 :(得分:2)

解压缩功能对二进制数据起作用,因此您可以尝试将字节存储在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;

答案 1 :(得分:0)

表中“压缩”字段的数据类型可能无效,应将其更改为varbinary(MAX)。 当您使用Compress函数时,错误的字段类型不会引起异常(例如nvarchar(MAX)),但是当您要使用decompress函数时,它将导致此错误。

您只需更改字段的数据类型并重新运行查询即可。