从SQL Server查询Python中的二进制值

问题描述 投票:1回答:1

我正在执行此查询

SELECT CMDB_ID FROM DB1.[dbo].[CDMID]

当我在SSMS 18上执行此操作时,我得到了:

enter image description here

尽管我不是该主题的专家,但我知道这些都是十六进制值。

我需要在python上执行此确切的查询,因此我可以通过脚本处理该信息,此脚本需要在不进行任何操作的情况下将HEX值作为输入(如您在SSMS输出中所见)。

因此,通过具有常规连接的pyodbc库:

SQLserver_Connection("Driver={SQL Server Native Client 11.0};"
                     "Server=INSTANCE;"
                     "Database=DB1;"
                     "UID=USER;"
                     "PWD=PASS;")

我明白了:

0   b'@\x12\x90\xb2\xbb\x92\xbbe\xa3\xf9:\xe2\x97@...
1   b'@"\xaf\x13\x18\xc9}\xc6\xb0\xd4\x87\xbf\x9e\...
2   b'@G\xc5rLh5\x1c\xb8h\xe0\xf0\xe4t\x08\xbb'
3   b'@\x9f\xe65\xf8tR\xda\x85S\xdcu\xd3\xf6*\xa2'
4   b'@\xa4\xcb^T\x06\xb2\xd0\x91S\x9e\xc0\xa7\xe543'
... ...
122 b'O\xa6\xe1\xd8\tA\xe9E\xa0\xf7\x96\x7f!"\xa3\...
123 b'O\xa9j,\x02\x89pF\xb9\xb4:G]y\xc4\xb6'
124 b'O\xab\xb6gy\xa2\x17\x1b\xadd\xc3\r\xa6\xee50'
125 b'O\xd7ogpWj\xee\xb0\xd8!y\xec\x08\xc7\xfa'
126 b"O\xf0u\x14\xcd\x8cT\x06\x9bm\xea\xddY\x08'\xef"

我有三个问题:

  1. 如何解释这些数据,为什么会得到这个?
  2. 是否有一种方法可以将这些数据恢复为原始十六进制值?如果不是...
  3. 如何获得原始的十六进制值?

我正在寻找解决方案,但还没有发现任何东西,因为您可以看到我不是这类主题的专家,所以如果您不能提供解决方案,我也将非常感谢您提供文档我需要一些背景知识,以便我自己提供解决方案。

python sql-server pyodbc
1个回答
0
投票

我认为您的问题仅仅是由于SSMS和Python对binary数据产生了不同的十六进制表示形式。您的列显然是binaryvarbinary列,当您在SSMS中查询时,您会看到其相当二进制值的标准十六进制表示形式,例如0x01476F726400

[使用pyodbc检索值时,您得到一个<class 'bytes'>对象,该对象以b'hex_representation'表示一圈:除了简单地显示b'\x01\x47\x6F\x72\x64\x00',Python还将呈现与可打印ASCII字符相对应的任何字节作为该字符,因此我们得到的是b'\x01Gord\x00'

除了那个小麻烦(IMO),好消息是,您已经在<class 'bytes'>对象中具有正确的字节,可以传递给任何希望接收二进制数据的Python函数。

© www.soinside.com 2019 - 2024. All rights reserved.