如何将Pandas读取的SQL Server rowversion二进制转为可注入查询的十六进制格式
报错原因
SQL Server 的 rowversion(也叫timestamp)类型属于二进制类型,要求查询中使用的二进制字面量必须为0x开头的无引号十六进制字符串格式。而你从Pandas DataFrame中取出的rowversion是Python原生bytes类型,直接通过%s字符串拼接注入SQL时,会输出Python bytes的字面量格式b'\x00...',完全不符合SQL语法规则,因此触发语法报错。
你提供的修复方案是正确的
rowversion = rowversion.hex() rowversion = '0x' + rowversion
这段代码的逻辑完全符合要求:bytes.hex()会将二进制数据转换为连续的十六进制字符串,拼接0x前缀后正好是SQL Server可识别的二进制字面量格式,可以正常使用。
更推荐的优化方案
直接拼接SQL字符串存在SQL注入风险,更建议使用Pandas内置的参数化查询能力,无需手动转换二进制格式,数据库驱动会自动处理类型映射:
# 以pyodbc驱动为例,参数占位符用? sql = ''' SELECT * FROM [dbo].[Table] WHERE [RowVersion] > ? ORDER BY [RowVersion] ASC ''' # 通过params参数传值,不需要手动做格式转换 df = pd.read_sql_query(sql, source_engine, params=(rowversion,))
内容的提问来源于stack exchange,提问作者Stakky
相关产品推荐
相关产品推荐

