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.