You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2019中如何将LZ77压缩二进制Blob数据转换为原始文本

问题排查与解决方案

之前尝试失败的核心原因

  • 类型转换逻辑错误:DECOMPRESS函数仅接受VARBINARY(MAX)类型的原始压缩字节作为入参,你将二进制先转换为VARCHAR的过程会按数据库编码做字节映射,直接破坏压缩数据的原始结构,不可能得到正确结果。
  • 压缩格式匹配验证:你给出的Data字段示例开头为0x1F8B08,这是标准GZIP格式的文件头,和Type字段标注的HTM;LZ77描述一致(GZIP底层基于LZ77算法实现),SQL Server 2016及以上版本自带的DECOMPRESS函数原生支持GZIP解压,不需要额外转字符串操作。

纯SQL实现方案

直接将IMAGE类型转为VARBINARY(MAX)传入DECOMPRESS,解压后的二进制结果按原始文本编码转成字符串即可,SQL Server 2019原生支持UTF-8编码,参考代码如下:

SELECT
    HostFieldName,
    Size,
    Type,
    -- 65001对应UTF-8编码,适配绝大多数前端生成的富文本
    CONVERT(
        VARCHAR(MAX),
        DECOMPRESS(CONVERT(VARBINARY(MAX), [Data])),
        65001
    ) AS OriginalHtmlContent
FROM [dbo].[TBL_BlobData]
WHERE [Type] = 'HTM;LZ77'

如果执行后出现中文乱码,可切换为Unicode编码接收:

SELECT
    HostFieldName,
    CONVERT(NVARCHAR(MAX), DECOMPRESS(CONVERT(VARBINARY(MAX), [Data]))) AS OriginalHtmlContent
FROM [dbo].[TBL_BlobData]

非标准LZ77格式的替代方案

如果上述纯SQL代码执行报错、或返回乱码,说明当前存储的LZ77数据是微软旧版系统(早期SharePoint、Dynamics、自研OA系统)常用的自定义LZ77封装格式,不是标准GZIP,这类格式没有内置SQL函数支持解压,可选择以下两种方案:

  • SQL CLR集成:用C#实现对应版本的LZ77解压逻辑,编译为CLR程序集注册到SQL Server中,注册完成后即可像内置函数一样在SQL语句中调用,性能接近原生函数。
  • 外部脚本批量处理:如果不方便开启SQL Server CLR权限,可将表中Data字段以原始二进制形式导出,用Python/C#编写轻量脚本,调用对应LZ77解压库批量解析后回写数据库即可,标准GZIP格式的Python解压核心逻辑参考:
import gzip

def parse_blob(blob_data: bytes) -> str:
    # 传入数据库读取的原始二进制值,解压后按UTF-8解码
    decompressed = gzip.decompress(blob_data)
    return decompressed.decode("utf-8")

内容的提问来源于stack exchange,提问作者rak11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 13:42:29