SQL CLR解压GZip数据的功能

本文关键字:功能 数据 GZip CLR 解压 SQL | 更新日期: 2023-09-27 18:17:27

我有两个用于压缩/解压缩NVARCHAR数据的CLR函数。

[SqlFunction(IsDeterministic = true, IsPrecise = true, DataAccess = DataAccessKind.None)]
public static SqlBytes ufn_GZipCompress(SqlString input) {
    if (input.IsNull || input.Value.Length == 0)
        return SqlBytes.Null;
    using (MemoryStream msInput = new MemoryStream(input.GetUnicodeBytes())) {
        using (MemoryStream msOutput = new MemoryStream()) {
            using (GZipStream deflateStream = new GZipStream(msOutput, CompressionMode.Compress, true)) {
                byte[] buffer = new byte[32768];
                int read;
                while ((read = msInput.Read(buffer, 0, buffer.Length)) > 0)
                    msOutput.Write(buffer, 0, read);
            }
            return new SqlBytes(msOutput.ToArray());
        }
    }
}
[SqlFunction(IsDeterministic = true, IsPrecise = true, DataAccess = DataAccessKind.None)]
public static SqlString ufn_GZipDecompress(SqlBytes input) {
    if (input.IsNull || input.IsNull)
        return SqlString.Null;
    byte[] buf = new byte[32768];
    using (MemoryStream msOutput = new MemoryStream()) {
        using (GZipStream deflateStream = new GZipStream(input.Stream, CompressionMode.Decompress, true)) {
            int bytesRead;
            while ((bytesRead = deflateStream.Read(buf, 0, 32768)) > 0)
                msOutput.Write(buf, 0, bytesRead);
        }
        return new SqlString(Encoding.UTF8.GetString(msOutput.ToArray()));
    }
}

问题是当我尝试解压缩二进制数据时,我没有得到预期的输出,例如:

SELECT dbo.[ufn_GZipDecompress](dbo.[ufn_GZipCompress](N'Hello World'))

返回
H

SQL CLR解压GZip数据的功能

我在某种程度上加密clr工作,并记得类似的事情,它原来是编码问题。sql的默认SQL_Latin1_General_CP1_CI_ASWindows-1252编码而不是UTF-8 !

我不确定这是否会成为您的GetUnicodeBytes以及您返回的编码的问题。您应该进行测试以确保input.GetUnicodeBytes()为您提供所需的结果,我通过重新编译和抛出数据的自定义异常来做到这一点,但我确信其他人有其他方法。

那么对于你的解压,你可以尝试这样做:

Encoding enc = Encoding.GetCoding(1252);
ecn.GetString(yourbytearray)