【问题标题】:Is it possible to combine .Net GZip compression and SQL Server compression?是否可以结合使用 .Net GZip 压缩和 SQL Server 压缩?
【发布时间】:2020-05-01 12:30:34
【问题描述】:

由于与网络带宽和性能相关的各种原因,我们有一个应用程序将大型 Unicode 字符串转换为使用 GZipStream .Net 框架 (.Net core 3.1) 功能压缩的字节数组。

我们希望将这些存储在 SQL Server 2017 varbinary(max) 列中以供以后检索和解压缩 - 这可以使用相同的 GZipStream 库进行解压缩。

我们想利用 T-SQL Decompress 函数来查询数据库服务器上的数据(无需将其全部带回 .Net 并解压缩它在那里)

虽然Decompress 似乎确实有效(因为它不会引发错误并且会生成可以转换为nvarchar(max)) 的二进制输出,但生成的 nvarchar 与原始源完全不同 - 它实际上崩溃了显示时 SSMS!

如果我们将解压后的字符串传递到 SQL Server 并在那里使用Compress 函数对其进行压缩,这不是问题,但我们不想这样做,因为它需要额外的解压步骤和额外的带宽消耗。

我已确保我们使用的是 SQL Server 2017 的 CU20,所以我认为这不是补丁问题。 我已经尝试在 .Net 库中使用不同的压缩比选项,但它们都会产生相同的问题。

看起来尽管都是 GZip 压缩,但 T-SQL 和 .Net 压缩算法不兼容,但如果有人成功地将两者结合起来,我将不胜感激。

【问题讨论】:

    标签: .net-core gzip sql-server-2017


    【解决方案1】:

    啊……我是个白痴!我的源字符串(它们是 XML)是 UTF-8 格式的,所以这行得通:

    using (var compressStream = new MemoryStream())
    using (var compressor = new GZipStream(compressStream, CompressionMode.Compress))
    {
        compressor.Write(Encoding.UTF8.GetBytes(largeString));
        compressor.Close();
        var bytesToWriteToSQLVarbinaryMax = compressStream.ToArray();
    }
    

    然后我可以这样做:

    SELECT Cast(Decompress(bytes) AS varchar(max)) FROM compressedTable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2010-09-16
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      相关资源
      最近更新 更多