Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Convertir un BINARY stocké en tant que VARCHAR en BINARY

Le résultat que vous obtenez est dû au fait que la chaîne "0003f80075177fe6" (un VARCHAR valeur) est convertie en points de code, et ces points de code sont servis en tant que valeur binaire. Puisque vous utilisez probablement un classement compatible ASCII, cela signifie que vous obtenez les points de code ASCII :0 est 48 (30 hexadécimal), f est 102 (66 hex) et ainsi de suite. Ceci explique le 30 30 30 33 66 38 30 30...

Ce que vous voulez faire à la place est d'analyser la chaîne comme une représentation hexadécimale des octets (00 03 f8 00 75 71 77 fe 66 ). CONVERT accepte un paramètre "style" supplémentaire qui vous permet de convertir des chaînes hexadécimales :

SELECT CONVERT(BINARY(16), '0003f80075177fe6', 2)

Le style 2 convertit une chaîne hexadécimale en binaire. (Le style 1 fait la même chose pour les chaînes qui commencent par "0x", ce qui n'est pas le cas ici.)

Notez que s'il y a moins de 16 octets (comme dans ce cas), la valeur est remplie à droite avec des zéros (0x0003F80075177FE60000000000000000 ). Si vous avez besoin d'un rembourrage à gauche à la place, vous devez le faire vous-même :

SELECT CONVERT(BINARY(16), RIGHT(REPLICATE('00', 16) + '0003f80075177fe6', 32), 2)

Enfin, notez que les littéraux binaires peuvent être spécifiés sans conversion simplement en les préfixant avec "0x" et sans utiliser de guillemets :SELECT 0x0003f80075177fe6 renverra une colonne de type BINARY(8) . Non pertinent pour cette requête, mais juste pour être complet.