如何提取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
相关产品推荐
相关产品推荐

