是否可以结合使用 .Net GZip 压缩和 SQL 服务器压缩?

Is it possible to combine .Net GZip compression and SQL Server compression?

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

我们想将它们存储在 SQL Server 2017 varbinary(max) 列中以供以后检索和解压 - 使用相同的 GZipStream 库解压效果很好。

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

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

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

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

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

啊……我是个白痴!我的源字符串(它们是 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