【问题标题】:Argument data type varchar(max) is invalid for argument 1 of Decompress function参数数据类型 varchar(max) 对 Decompress 函数的参数 1 无效
【发布时间】:2017-03-16 11:43:13
【问题描述】:

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

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

一个示例值

This is my trial string

生成的 GZIP 值

FwAAAB+LCAAAAAAABAALycgsVgCi3EqFkqLMxByFYiCVlw4AJnX75BcAAAA=

是否可以选择从 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);
    }
}

【问题讨论】:

    标签: c# sql-server gzip compression


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      可能您的表中压缩字段的数据类型无效,您应该将其更改为 varbinary(MAX)。 当你使用压缩函数错误类型的字段不会导致异常(例如nvarchar(MAX))但是当你想使用解压缩函数时会导致这个错误。

      您可以简单地更改字段的数据类型并重新运行查询。

      【讨论】:

      • 有助于了解 compress 在 nvarchar(max) 字段中使用例如 json 时不会出错,但是您无法解压缩它。 +1
      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 2019-09-30
      • 2016-07-29
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2022-11-09
      相关资源
      最近更新 更多