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

SQL Server VARBINARY字段PDF二进制数据转存OPENROWSET BLOB异常问题

问题:SQL Server VARBINARY(MAX)中PDF数据通过OPENROWSET BLOB转移异常

我在将SQL Server VARBINARY(MAX)字段存储的PDF二进制数据通过OPENROWSET BLOB方法转移至客户数据库时遇到异常,具体情况如下:

  • 读取PDF二进制数据的Python代码:
with open(file_path, 'rb') as file:
    binary_data = file.read()
  • 将二进制数据转换为十六进制字符串并存储到VARBINARY(MAX)字段的代码:
if isinstance(binary_data, tuple):
    binary_data = b''.join(binary_data)
binary_data = "0x" + binary_data.hex()
binary_data = bytes(binary_data, encoding='utf-8')
  • 异常现象:
    • 直接复制VARBINARY字段内容到在线转换器可成功还原PDF;
    • 客户使用OPENROWSET BLOB方法转移后,数据库中存储的数据十六进制长度远大于原数据,在线转换器无法还原PDF;
    • 尝试将二进制数据编码为base64传输,客户应用仍无法读取文件,base64编码代码:
with open(file_path, 'rb') as f:
    binary_data = base64.b64encode(f.read())
  • 我的SQLAlchemy代码实现:
SQL_USERNAME = os.getenv("MSSQL_USERNAME")
SQL_USERPWD = os.getenv("MSSQL_PASSWORD")
SQL_PORT = os.getenv("MSSQL_PORT")
SQL_HOST = os.getenv('MSSQL_HOST')
SQL_DATABASE = os.getenv('MSSQL_DATABASE')
conn_string = f"mssql+pyodbc://{SQL_USERNAME}:{SQL_USERPWD}@{SQL_HOST}:{SQL_PORT}/{SQL_DATABASE}?driver=ODBC+Driver+17+for+SQL+Server"
engine = create_engine(conn_string)

metadata = MetaData()
orders_table = Table('ATTACHMENTS_TABLE', metadata,
        Column('id', UUID(as_uuid=True), primary_key=True, default = uuid4),
        Column('attachment', VARBINARY(max))
    )

insert = orders_table.insert().values(
    attachment = data_model.attachment_to_hex()
)

with engine.connect() as conn, conn.begin():
    conn.execute(insert)
  • 包含attachment_to_hex()方法的DataModel代码:
from pydantic import BaseModel
from typing import Optional


class OrderModel(BaseModel):
    attachment: Optional[bytes]

    def attachment_to_hex(self):
        try:
            if isinstance(self.attachment, tuple):
                self.attachment = b''.join(self.attachment)
            attachment_hex = "0x" + self.attachment.hex()
            attachment_bytes = bytes(attachment_hex, encoding='utf-8')
            print(attachment_bytes)
            return attachment_bytes
        except Exception as e:
            print(f"Error converting to hex value: {e}")

请问有没有人在使用SQL Server或C#时遇到过类似问题?能否分享OPENROWSET或FileStream在数据库中编码文件的相关见解?恳请提供帮助和指导。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:55:08