是否可以结合使用 .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
由于与网络带宽和性能相关的各种原因,我们有一个应用程序将大型 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