Het resultaat dat u krijgt is omdat de tekenreeks "0003f80075177fe6" (een VARCHAR
waarde) wordt geconverteerd naar codepunten en deze codepunten worden als binaire waarde opgediend. Aangezien u waarschijnlijk een ASCII-compatibele sortering gebruikt, betekent dit dat u de ASCII-codepunten krijgt:0
is 48 (30 hex), f
is 102 (66 hex) enzovoort. Dit verklaart de 30 30 30 33 66 38 30 30...
Wat u in plaats daarvan wilt doen, is de string ontleden als een hexadecimale weergave van de bytes (00 03 f8 00 75 71 77 fe 66
). CONVERT
accepteert een extra "stijl"-parameter waarmee u hexstrings kunt converteren:
SELECT CONVERT(BINARY(16), '0003f80075177fe6', 2)
Stijl 2 converteert een hexstring naar binair. (Stijl 1 doet hetzelfde voor strings die beginnen met "0x", wat hier niet het geval is.)
Merk op dat als er minder dan 16 bytes zijn (zoals in dit geval), de waarde rechts wordt gevuld met nullen (0x0003F80075177FE60000000000000000
). Als je het in plaats daarvan links-opgevuld nodig hebt, moet je dat zelf doen:
SELECT CONVERT(BINARY(16), RIGHT(REPLICATE('00', 16) + '0003f80075177fe6', 32), 2)
Merk tot slot op dat binaire letterlijke waarden zonder conversie gespecificeerd kunnen worden door ze simpelweg te laten voorafgaan door "0x" en geen aanhalingstekens te gebruiken:SELECT 0x0003f80075177fe6
retourneert een kolom van het type BINARY(8)
. Niet relevant voor deze vraag, maar voor de volledigheid.