HASHBYTES,sql 中的sha2_256在从 python 调用时会引入坏字符



我们的旧SQL遗留代码之一,使用HASHBYTES函数和sha2_256转换sql中的数字列。

整个过程正在转向python,因为我们在遗留工作的基础上投入了一些高级用法。但是,当使用连接器时,我们调用相同的sql代码,HASHBYTES('sha2_256',column_name(id返回大量垃圾的值。

在 sql 中运行代码会导致此

Column      Encoded_Column
101286297   0x7AC82B2779116F40A8CEA0D85BE4AA02AF7F813B5383BAC60D5E71B7BDB9F705

从 python 运行相同的 sql 查询会导致

Column      Encoded_Column
101286297 

b"Z\xC8+'y\x11o@\xA8\xce\xA0\xD8[\xE4\XaA\X02\Xaf\X7F\x81;S\x83\xba\xc6\r^q\xb7\xbd\xb9\xf7\x05">

代码是

Select Column,HASHBYTES('SHA2_256', CONVERT(VARBINARY(8),Column)) as Encoded_Column from table

我已经尝试了通常的垃圾清除,但没有帮助

你得到了正确的结果,但显示为原始字节(这就是为什么你在b"..."中有 b 的原因(。

查看SQL的结果,您的数据用十六进制编码。

因此,要转换 python 结果,您可以执行以下操作:

x = b"zxc8+'yx11o@xa8xcexa0xd8[xe4xaax02xafx7fx81;Sx83xbaxc6r^qxb7xbdxb9xf7x05"
x.hex().upper()

结果将是:

'7AC82B2779116F40A8CEA0D85BE4AA02AF7F813B5383BAC60D5E71B7BDB9F705'

这就是你在SQL中所拥有的。

您可以在此处阅读有关python代码中不存在的 SQL 结果开头0x的更多信息。

最后,如果您正在使用熊猫,则可以使用以下方法转换整个列:

df["Encoded_Column"] = df["Encoded_Column"].apply(lambda x: x.hex().upper())
# And if you want the '0x' at the start do:
df["Encoded_Column"] = "0x" + df["Encoded_Column"]

相关内容

  • 没有找到相关文章

最新更新