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

如何提取SQL Server中以text类型存储的二进制格式文件?

SQL Server text字段存储十六进制文件提取方法

核心原理

你存储在text字段中的89504E47...内容是二进制文件的十六进制字符串表示(示例开头为PNG文件的标准魔数,实际是PNG格式而非JPG),并非直接存储的二进制流,所以直接导出text内容或无参数转换二进制都会失败,需要先完成「十六进制字符串→二进制字节流」的转换,再写入本地文件。

方法1:SSMS 单文件快速导出

适合单条或少量文件提取:

  • 执行转换SQL,将text字段的十六进制字符串转成真实二进制:
SELECT CONVERT(VARBINARY(MAX), CAST(你的存储字段名 AS VARCHAR(MAX)), 2) AS 文件二进制
FROM 你的表名
WHERE 记录筛选条件

注意:CONVERT的第三个参数2代表输入是无0x前缀的十六进制字符串,必须填写否则转换结果错误。

  • 查询结果出来后,右键点击「文件二进制」列的结果值,选择「将结果另存为」,文件类型选「所有文件」,文件名后缀设置为.png保存即可。

方法2:Python 批量稳定导出

适合大量文件提取,容错率更高:

  • 先安装数据库依赖:pip install pymssql
  • 运行示例脚本:
import pymssql

# 替换为你的数据库连接信息
conn = pymssql.connect(
    server="数据库IP/实例名",
    user="登录账号",
    password="登录密码",
    database="数据库名"
)
cursor = conn.cursor()

# 替换为你的查询语句,可添加条件筛选要导出的记录
cursor.execute("SELECT 存储十六进制的字段名, 可选的文件名字段 FROM 表名")

for idx, row in enumerate(cursor.fetchall()):
    hex_content = row[0].strip() # 清理字符串前后空白/换行符
    # 自定义文件名,有文件名字段可直接用row[1]
    file_name = row[1] if len(row) > 1 and row[1] else f"导出文件_{idx}.png"
    # 十六进制转二进制
    file_binary = bytes.fromhex(hex_content)
    # 写入本地
    with open(file_name, "wb") as f:
        f.write(file_binary)

cursor.close()
conn.close()
print("导出完成")

常见问题排查

  • 导出的文件打不开:优先检查后缀名是否正确,示例给出的内容是PNG格式,设置为JPG会无法打开;其次检查转换时是否加了参数2
  • 转换报错:检查text字段内容是否有非十六进制字符,可先做字符串清洗再转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:42:00