La mise à jour insère différentes valeurs de hachage qu'une sélection ne

J'essaye de mettre à jour une nouvelle colonne dans ma table d' user SQL Server avec le hachage d'une autre colonne.

Lorsque je teste la conversion avec une instruction select, elle renvoie le hachage MD5 correct que je reçois des générateurs de hachage en ligne.

 select CONVERT(VARCHAR(32), HashBytes('MD5', 'valuetohash'), 2) 

lorsque j'utilise cette même conversion dans une instruction de mise à jour comme indiqué ci-dessous, j'obtiens une valeur différente, insérée alors l'instruction select avec la même valeur hachée.

 UPDATE users SET [newcolumn1] = CONVERT(VARCHAR(32), HashBytes('MD5', column1), 2) 

Qu'est-ce que je fais mal?

La valeur que vous avez dans users.column1 ne correspond pas exactement à la valeur que vous passez manuellement à travers HashBytes tant que test. Pour confirmer que cela fonctionne lorsque les valeurs sont les mêmes, essayez:

 DECLARE @users TABLE ( column1 VARCHAR(100), newcolumn1 VARCHAR(32) ) INSERT INTO @users SELECT 'some text', NULL SELECT CONVERT(VARCHAR(32), HashBytes('MD5', 'some text'), 2) UPDATE @users SET newcolumn1 = CONVERT(VARCHAR(32), HashBytes('MD5', column1), 2) SELECT newcolumn1 FROM @users 

Vous verrez que les résultats obtenus pour chaque SELECT sont les mêmes, car les valeurs de 'some text' et @users.column1 sont identiques.

Essayez de comparer vos valeurs en premier:

 SELECT CASE WHEN column1 = 'expectedValue' THEN 'MATCH' ELSE 'DIFFERENCE' END AS MatchCheck FROM users 

ou

 SELECT column1 FROM users WHERE column1 = 'expectedValue' 

Si vous obtenez des résultats de la première requête où MatchCheck = 'MATCH' ou des résultats de la deuxième requête, alors vous devriez aussi get les résultats de votre UPDATE qui donnent le hachage que vous attendez, car les valeurs sont les mêmes.

Comme mentionné par ughai dans les commentaires, il est très probable que vous ayez des espaces ou des caractères non imprimables dans les valeurs de votre database que vous n'incluez pas lorsque vous exécutez le hachage à sec, d'où les résultats différents.