【问题标题】:Retrieve compressed GZip info from SQL Server从 SQL Server 检索压缩的 GZip 信息
【发布时间】:2022-02-24 22:34:49
【问题描述】:

我有一个存储压缩 GZip 文件内容的表。不确定原始信息是 XML 还是 CSV 还是什么。我无权访问原版。 PulledContent 列是 varbinary,看起来像这样 0x1F8B08000000000004006553C18E9B3010BD57EA3F706C0F2B63...

如何将这些信息转换为人类可读的内容?

我认为解决方案可能在这里:varbinary to string on SQL Server

但是当我尝试这个时:SELECT CONVERT(VARCHAR(1000), PulledContent, 2);

它只是给了我一个稍微不同的数字和字母字符串,比如1F8B08000000000004006553C18E9B3010BD57EA3F70...

我错过了什么?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008-r2


    【解决方案1】:

    您从“PulledContent”列返回的数据是二进制 GZip 压缩格式。为了将此二进制数据转换为人类可读的格式,您需要执行以下任务。

    1) 使用适当的库解压缩二进制数据。如果您在 windows 环境中,您可以使用 .net 类 GZipStream 来执行此任务。

    2) 将二进制数据转换为字符串。您可以通过使用 .net Encoding 类来完成此操作。

    string data = Encoding.Default.GetString(bytes); 
    

    享受吧!

    【讨论】:

    • 我还应该补充一点,我无权访问 Visual Studio,也无权安装新程序。严重限制,我知道。我希望有一种方法只使用 SSMS。
    • @pteridoid 您不需要 Visual Studio 或任何新程序。您已经安装了 csc.exe C# 编译器。您可以编译 SQLCLR 程序集并将它们部署在目标系统上。
    【解决方案2】:

    注意: 在 SQL Server 2016 发布之前提出并回答了这个问题,该版本引入了 COMPRESSDECOMPRESS 内置函数(仅公开了 Compress / @987654325 @ .NET GZipStream 类的操作)。如果您使用的是 SQL Server 2016 或更高版本,请先尝试这些。


    要在 T-SQL(无论是在 SSMS 还是 SQL 脚本等)中解压缩 VARBINARY 值,您可以使用 SQLCLR 函数通过简单的 SELECT 语句进行转换。您将使用@Doug 提到的GzipStream 类。

    但是,如果您不想编写任何代码来获得此功能,则可以在SQL# SQLCLR 库的免费版本中使用它(我是该库的作者,同样,此功能是免费的) .例如:

    SELECT SQL#.Util_GUnzip(PulledContent)
    FROM   SchemaName.TableName
    WHERE  SomeField = something;
    

    这也将返回一个VARBINARY 值,但它将是未压缩的值。那时,您可以尝试将其转换为各种形式以查看其真实情况。二进制文件仍然是二进制文件,但纯文本应该至少部分可读(如果排序规则是正确的编码,则完全可读):

    SELECT CONVERT(VARCHAR(MAX), SQL#.Util_GUnzip(PulledContent))
    FROM   SchemaName.TableName
    WHERE  SomeField = something;
    

    或:

    SELECT CONVERT(NVARCHAR(MAX), SQL#.Util_GUnzip(PulledContent))
    FROM   SchemaName.TableName
    WHERE  SomeField = something;
    

    【讨论】:

    • 没有测试过,但是这个答案需要注意。我们遇到了在列中保存大量数据集以验证我们插入几个月的所有内容的问题。我计划在保存之前对其进行压缩,并在将记录呈现给消费者时使其可读。这可能会很有帮助。
    • @JamshaidK。谢谢。请参阅我刚刚发布到此答案顶部的有关我第一次发布此答案时不存在的内置功能的更新。这些函数可能与您使用的 SQL Server 版本有关。
    • 我已经完成了这些功能。不过有 GZip 实用程序加号还是不错的,对于旧版本,这仍然非常有用。
    【解决方案3】:

    应该不会比这复杂多少,用最优秀的DotNetZip

    static byte[] FetchAndDeCompressData( int key )
    {
      using ( SqlConnection connection = new SqlConnection("your-connect-string-here") )
      using ( SqlCommand cmd = connection.CreateCommand() )
      {
        cmd.CommandType = CommandType.StoredProcedure ;
        cmd.CommandText = "dbo.fetch_gzipped_data" ;
        cmd.Parameters.AddWithValue( "@key" , key ) ;
        byte[] bytes = (byte[]) cmd.ExecuteScalar() ;
        return Ionic.Zlib.GZipStream.UncompressBuffer( bytes ) ;
      }
    }
    

    你对解压缩八位字节的byte[] 做什么取决于它是什么。如果你知道它是文本,你可以简单地通过类似的方式运行它

    Encoding.Default.GetString( bytes ) ;
    

    但您需要知道底层编码是什么。


    编辑注释: DotNetZip 曾经住在 Codeplex。 Codeplex 已关闭。旧档案仍然是available at Codeplex。看起来代码已经迁移到Github了:


    【讨论】:

      猜你喜欢
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多