我有一个存储压缩GZip文件内容的表。不确定原始信息是XML还是CSV或什么。我无法访问原文。 PulledContent列是varbinary,看起来像0x1F8B08000000000004006553C18E9B3010BD57EA3F706C0F2B63...
如何将此信息转换为人类可读的内容?
我认为解决方案可能就在这里:varbinary to string on SQL Server。
但是当我尝试这个时:SELECT CONVERT(VARCHAR(1000), PulledContent, 2);
它只是给我一个稍微不同的数字和字母串,如1F8B08000000000004006553C18E9B3010BD57EA3F70...
我错过了什么?
答案 0 :(得分:3)
从“PulledContent”列返回的数据采用二进制GZip压缩格式。为了将此二进制数据转换为人类可读格式,您需要执行以下任务。
1)使用适当的库解压缩二进制数据。如果您在Windows环境中,则可以使用.net类GZipStream来执行此任务。
2)将二进制数据转换为字符串。您可以使用.net Encoding类完成此操作。
string data = Encoding.Default.GetString(bytes);
享受!
答案 1 :(得分:1)
使用最优秀的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:
答案 2 :(得分:1)
要解压缩T-SQL中的VARBINARY
值(无论是SSMS还是SQL脚本等),您可以使用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;