Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Converter um BINARY armazenado como VARCHAR para BINARY


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.