Chcę uzyskać skrót MD5 wartości ciągu w programie SQL Server 2005. Robię to za pomocą następującego polecenia:
SELECT HashBytes('MD5', 'HelloWorld')
Jednak zwraca to VarBinary zamiast wartości VarChar. Jeśli spróbuję przekonwertować 0x68E109F0F40CA72A15E05CC22786F8E6
na VarChar, otrzymam há ðô§*à\Â'†øæ
zamiast 68E109F0F40CA72A15E05CC22786F8E6
.
Czy istnieje rozwiązanie oparte na języku SQL?
sql
sql-server
GateKiller
źródło
źródło
źródło
Użyj
master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
zamiastmaster.dbo.fn_varbintohexstr
a potemsubstringing
wynik.W rzeczywistości
fn_varbintohexstr
dzwonifn_varbintohexsubstring
wewnętrznie. Pierwszy argumentfn_varbintohexsubstring
mówi mu, aby dodać0xF
jako przedrostek, czy nie.fn_varbintohexstr
zwracafn_varbintohexsubstring
się1
jako pierwszy argument wewnętrznie.Ponieważ nie potrzebujesz
0xF
, zadzwońfn_varbintohexsubstring
bezpośrednio.źródło
W przeciwieństwie do tego, co mówi David Knight , te dwie alternatywy zwracają tę samą odpowiedź w MS SQL 2008:
Wygląda więc na to, że pierwszy jest lepszym wyborem, począwszy od wersji 2008.
źródło
(1 do konwersji szesnastkowej na ciąg znaków)
przekonwertuj to na niższy i usuń 0x z początku ciągu przez podłańcuch:
dokładnie to samo, co otrzymujemy w C # po przekonwertowaniu bajtów na string
źródło
Dzięki osobistemu doświadczeniu w korzystaniu z następującego kodu w ramach procedury składowanej, która zahaszowała zmienną SP, mogę potwierdzić, chociaż nieudokumentowane, ta kombinacja działa w 100%, jak na moim przykładzie:
źródło
Zmiana typu danych na varbinary wydaje się działać najlepiej.
źródło