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

无法将bytes类型密码哈希值存入SQL Server varbinary列的问题求助

解决方案

一、DBeaver手动执行插入的修复

SQL Server不支持Python风格的b'xxx'字节串语法,要插入二进制数据需要把字节转成十六进制字符串,前面加0x前缀直接使用即可,不需要额外调用convert函数。
你提供的哈希值对应的插入语句可以修改为:

insert into users.dbo.allusers values (123456789, 
0xc8c2069f8e96adb3147297526d2227fd627403c83146c539d033cf587388ff9562677fd1f6fc98e5787e639e629189807b146930996626a55c653ff2bd06f7d0, 
'a@a.com',
'a', 
'b'
)

如果需要将Python生成的字节串转成SQL Server可用的十六进制格式,调用storage.hex().upper()即可得到无前缀的十六进制串,前面拼接0x就可以直接放到SQL语句中执行。

二、Flask pymssql代码修复

报错是因为你没有使用参数化查询的正确用法,手动拼接SQL既会因为二进制值内的特殊字符触发语法错误,还存在SQL注入风险,修改逻辑如下:

  1. 不要手动将参数拼接到SQL语句中
  2. 直接把参数按顺序放到cursor.execute的第二个参数位置,pymssql会自动处理二进制数据适配、特殊字符转义的所有逻辑

修改后的核心代码如下:

def add_new_user():
    data = request.get_json(silent=True, force=True)
    cpf = data.get('cpf')
    origin_password = data.get('password')
    email = data.get('email')
    fname = data.get('fname')
    lname = data.get('lname')
    password_hash = generate_password(origin_password)

    mssqlhost = '127.0.0.1'
    mssqluser = 'sqlserver'
    mssqlpass = 'sqlserver'
    mssqldb = 'users'

    try:
        mssqlconn = pymssql.connect(
            mssqlhost, mssqluser, mssqlpass, mssqldb)
        print("Connection Established to MS SQL server.")
        cursor = mssqlconn.cursor()
        stmt  = "insert into users.dbo.allusers (cpf, password, email, fname, lname) values (%s,%s,%s,%s,%s)"
        # 直接传入参数元组即可,不需要手动拼接
        cursor.execute(stmt, (cpf, password_hash, email, fname, lname))
        mssqlconn.commit()
        mssqlconn.close()
        return {"success":"true"}
    except Exception as e:
        print(e)
        return {"success":"false"}

generate_password返回的字节类型数据可以直接传入参数化查询,不需要做任何额外转换,pymssql会自动适配数据库的varbinary字段类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 13:33:00