Запрос двоичных значений в Python с сервера SQL - PullRequest
0 голосов
/ 27 мая 2020

Я выполняю этот запрос

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

, когда я делаю это в SSMS 18, я получаю следующее:

enter image description here

Я знаю, что это значения HEX, хотя я не эксперт по topi c.

Мне нужно выполнить этот точный запрос на 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. Что я могу сделать, чтобы получить исходное HEX-значение?

Я ищу решение, но пока ничего не нашел, так как вы можете Видите ли, я не эксперт по такого рода темам, поэтому, если вы не можете предложить решение, я также буду очень признателен за документы с некоторыми базовыми знаниями, которые мне нужно получить, чтобы я мог предоставить решение самостоятельно.

1 Ответ

1 голос
/ 28 мая 2020

Я думаю, ваша проблема просто связана с тем, что SSMS и Python создают разные шестнадцатеричные представления из двоичных данных. Ваш столбец, по-видимому, является столбцом binary или varbinary, и когда вы запрашиваете его в SSMS, вы видите его довольно стандартное шестнадцатеричное представление двоичных значений, например, 0x01476F726400.

Когда вы извлекаете значение используя pyodb c, вы получаете объект <class 'bytes'>, который представлен как b'hex_representation' с одним поворотом: вместо простого отображения b'\x01\x47\x6F\x72\x64\x00', Python будет отображать любой байт, который соответствует печатаемому символу ASCII в качестве этого символа, поэтому вместо этого мы получаем b'\x01Gord\x00'.

Помимо этого незначительного раздражения (IMO), хорошая новость в том, что у вас уже есть правильные байты в объекте <class 'bytes'>, готовые передать любую функцию Python, которая ожидает получения двоичных данных.

...