O resultado que você obtém é porque a string "0003f80075177fe6" (um
VARCHAR
value) é convertido em pontos de código, e esses pontos de código são servidos como um valor binário. Como você provavelmente está usando um agrupamento compatível com ASCII, isso significa que você obtém os pontos de código ASCII:0
é 48 (30 hex), f
é 102 (66 hex) e assim por diante. Isso explica o 30 30 30 33 66 38 30 30...
O que você quer fazer é analisar a string como uma representação hexadecimal dos bytes (
00 03 f8 00 75 71 77 fe 66
). CONVERT
aceita um parâmetro extra "style" que permite converter hexstrings:SELECT CONVERT(BINARY(16), '0003f80075177fe6', 2)
O estilo 2 converte um hexstring em binário. (O estilo 1 faz o mesmo para strings que começam com "0x", o que não é o caso aqui.)
Observe que, se houver menos de 16 bytes (como neste caso), o valor será preenchido com zeros à direita (
0x0003F80075177FE60000000000000000
). Se você precisar de preenchimento à esquerda, você deve fazer isso sozinho:SELECT CONVERT(BINARY(16), RIGHT(REPLICATE('00', 16) + '0003f80075177fe6', 32), 2)
Por fim, observe que os literais binários podem ser especificados sem conversão simplesmente prefixando-os com "0x" e não usando aspas:
SELECT 0x0003f80075177fe6
retornará uma coluna do tipo BINARY(8)
. Não é relevante para esta consulta, mas apenas para completar.