能否将 .Net GZip 压缩和 SQL Server 压缩结合使用?

3
由于网络带宽和性能等各种原因,我们有一个应用程序,其中大型Unicode字符串被转换为使用.Net Core 3.1的GZipStream .Net框架功能压缩的字节数组。
我们希望将它们存储在SQL Server 2017的 varbinary(max)列中,以便以后检索和解压缩 - 使用相同的GZipStream库进行解压缩可以正常工作。
我们还想利用T-SQL Decompress函数,能够在DB服务器上查询数据(而无需将其全部带回到.Net并在那里解压缩)。
虽然 Decompress 似乎有效(即它不会抛出错误并且产生可转换为nvarchar(max)的二进制输出),但生成的nvarchar与原始源完全不同-实际上显示时会导致SSMS崩溃!
如果我们将解压缩的字符串传递到 SQL Server 并在那里使用Compress函数进行压缩,这不是一个问题,但我们不想这样做,因为它需要额外的解压缩步骤和额外的带宽消耗。
我已经确保我们使用的是 SQL Server 2017 的 CU20 补丁,因此我认为这不是一个修补程序问题。 我已经尝试使用 .Net 库中的不同压缩比选项,但它们都产生了相同的问题。
尽管 T-SQL 和 .Net 压缩算法都是 GZip 压缩,但似乎它们并不兼容,但如果有人成功地将两者结合起来,请告诉我。
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接