【问题标题】:Querying binary values in Python from SQL server从 SQL Server 查询 Python 中的二进制值
【发布时间】:2020-05-27 19:16:03
【问题描述】:

我正在执行这个查询

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

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

我知道这些是 HEX 值,尽管我不是该主题的专家。

我需要在 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. 有没有办法将这些数据恢复为原始 HEX 值?如果不是……
  3. 如何才能收到原始 HEX 值?

我一直在寻找解决方案,但还没有找到任何东西,正如您所见,我不是此类主题的专家,所以如果您无法提供解决方案,我也会非常感谢我需要获得一些背景知识的文档,以便我可以自己提供解决方案。

【问题讨论】:

  • SQL Server 没有十六进制数据类型。您在 SSMS 中看到的可能是 varbinary 列,以十六进制表示。在 Python 中,您可以将其视为字节数组,也就是 bytes。参考:Data type mappings between Python and SQL Server
  • 感谢文档很有帮助,我也不知道这是 varbinary 值由于某种原因显示为十六进制。

标签: python sql-server pyodbc


【解决方案1】:

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

当您使用 pyodbc 检索值时,您会得到一个 <class 'bytes'> 对象,该对象表示为 b'hex_representation' 有一个转折点:Python 不会简单地显示 b'\x01\x47\x6F\x72\x64\x00',而是将与可打印的 ASCII 字符对应的任何字节呈现为字符,所以我们得到b'\x01Gord\x00'

撇开小麻烦 (IMO) 不谈,好消息是您已经在 <class 'bytes'> 对象中拥有正确的字节,准备好传递给任何期望接收二进制数据的 Python 函数。

【讨论】:

  • 谢谢!所以在了解了这一点后,我使用了print(codecs.encode(bytesSTR, 'hex_codec')) 并得到了预期值,这似乎是一个不必要的问题,但我真的不知道下一步该做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
相关资源
最近更新 更多