HASHBYTES, sha2_256 в sql вводит плохие символы при вызове из python - PullRequest
3 голосов
/ 17 января 2020

Один из наших старых sql унаследованных кодов преобразует числовой столбец в sql с использованием функции HASHBYTES и sha2_256.

Весь процесс переходит на python, поскольку мы вводим некоторые расширенные использование поверх традиционной работы. Однако при использовании соединителя мы вызываем тот же код sql, идентификатор HASHBYTES ('sha2_256', column_name), возвращающий значения с большим количеством мусора.

Запуск кода в sql приводит к этому

Column      Encoded_Column
101286297   0x7AC82B2779116F40A8CEA0D85BE4AA02AF7F813B5383BAC60D5E71B7BDB9F705

Выполнение того же sql запроса из python приводит к

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

Я пробовал обычное удаление мусора, но не помогает

1 Ответ

5 голосов
/ 24 января 2020

Вы получаете правильный результат, но отображается как необработанные байты (вот почему у вас есть b в b"...").

Просмотр результата из SQL вас иметь данные, закодированные как шестнадцатеричный .

Таким образом, чтобы преобразовать результат python, вы можете сделать:

x = 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"

x.hex().upper()

И результат будет:

'7AC82B2779116F40A8CEA0D85BE4AA02AF7F813B5383BAC60D5E71B7BDB9F705'

То, что вы имели в SQL.

Вы можете прочитать больше здесь о 0x в начале SQL результат, которого нет в коде python.

И, наконец, если вы работаете с pandas, вы можете преобразовать весь столбец с помощью:

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"]
...