Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Converti un BINARY memorizzato come VARCHAR in BINARY

Il risultato che ottieni è perché la stringa "0003f80075177fe6" (a VARCHAR value) viene convertito in punti di codice e questi punti di codice vengono serviti come un valore binario. Dato che probabilmente stai utilizzando un confronto compatibile con ASCII, ciò significa che ottieni i punti di codice ASCII:0 è 48 (30 esadecimale), f è 102 (66 esadecimale) e così via. Questo spiega il 30 30 30 33 66 38 30 30...

Quello che vuoi fare invece è analizzare la stringa come rappresentazione esadecimale dei byte (00 03 f8 00 75 71 77 fe 66 ). CONVERT accetta un parametro "stile" aggiuntivo che ti consente di convertire stringhe esadecimali:

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

Lo stile 2 converte una stringa esadecimale in binaria. (Lo stile 1 fa lo stesso per le stringhe che iniziano con "0x", che non è il caso qui.)

Nota che se sono presenti meno di 16 byte (come in questo caso), il valore viene riempito a destra con zeri (0x0003F80075177FE60000000000000000 ). Se invece ti serve il tasto sinistro, devi farlo da solo:

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

Infine, nota che i letterali binari possono essere specificati senza conversione semplicemente anteponendo loro "0x" e non usando le virgolette:SELECT 0x0003f80075177fe6 restituirà una colonna di tipo BINARY(8) . Non rilevante per questa query, ma solo per completezza.