从 SQL 服务器查询 Python 中的二进制值
Querying binary values in Python from SQL server
我正在执行此查询
SELECT CMDB_ID FROM DB1.[dbo].[CDMID]
当我在 SSMS 18 上执行此操作时,我得到以下信息:
我知道这些是十六进制值,尽管我不是该主题的专家。
我需要在 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"
我有三个问题:
- 如何解释这些数据,我为什么会得到这个?
- 有没有办法将这些数据恢复为原始的十六进制值?如果不是...
- 我怎样才能收到原始的 HEX 值?
我一直在寻找解决方案,但还没有找到任何解决方案,如您所见,我不是此类主题的专家,所以如果您不能提供解决方案,我也会,非常感谢包含我需要获得的一些背景知识的文档,以便我可以自己提供解决方案。
我认为您的问题仅仅是因为 SSMS 和 Python 产生 二进制 数据的不同 十六进制表示 .您的列显然是 binary
或 varbinary
列,当您在 SSMS 中查询它时,您会看到它相当标准的二进制值十六进制表示形式,例如 0x01476F726400
.
当您使用 pyodbc 检索值时,您会得到一个 <class 'bytes'>
对象,该对象表示为 b'hex_representation'
并进行一次转折:不是简单地显示 b'\x01\x47\x6F\x72\x64\x00'
,Python 将将对应于可打印 ASCII 字符的任何字节呈现为该字符,因此我们得到 b'\x01Gord\x00'
。
撇开那个小烦恼 (IMO) 不谈,好消息是您已经在 <class 'bytes'>
对象中拥有正确的字节,准备传递给任何希望接收二进制文件的 Python 函数数据。
我正在执行此查询
SELECT CMDB_ID FROM DB1.[dbo].[CDMID]
当我在 SSMS 18 上执行此操作时,我得到以下信息:
我知道这些是十六进制值,尽管我不是该主题的专家。
我需要在 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"
我有三个问题:
- 如何解释这些数据,我为什么会得到这个?
- 有没有办法将这些数据恢复为原始的十六进制值?如果不是...
- 我怎样才能收到原始的 HEX 值?
我一直在寻找解决方案,但还没有找到任何解决方案,如您所见,我不是此类主题的专家,所以如果您不能提供解决方案,我也会,非常感谢包含我需要获得的一些背景知识的文档,以便我可以自己提供解决方案。
我认为您的问题仅仅是因为 SSMS 和 Python 产生 二进制 数据的不同 十六进制表示 .您的列显然是 binary
或 varbinary
列,当您在 SSMS 中查询它时,您会看到它相当标准的二进制值十六进制表示形式,例如 0x01476F726400
.
当您使用 pyodbc 检索值时,您会得到一个 <class 'bytes'>
对象,该对象表示为 b'hex_representation'
并进行一次转折:不是简单地显示 b'\x01\x47\x6F\x72\x64\x00'
,Python 将将对应于可打印 ASCII 字符的任何字节呈现为该字符,因此我们得到 b'\x01Gord\x00'
。
撇开那个小烦恼 (IMO) 不谈,好消息是您已经在 <class 'bytes'>
对象中拥有正确的字节,准备传递给任何希望接收二进制文件的 Python 函数数据。