Sulla base della domanda recent.Casting binary to bit
Qualcuno può indicarmi una spiegazione di quanto segue?
Se lancio binary(4)
costante 0x80000000
di int
, prendere il valore risultante per gettarlo ai bit
tipo, il risultato è 1.
select cast(0x80000000 as int) --> -2147483648
select cast(-2147483648 as bit) --> 1
Ma se lancio 0x80000000
di bit digitare direttamente il risultato è 0.
select cast(0x80000000 as bit) --> 0
speravo di ottenere 1 in questo caso, thinkning che, probabilmente, questa espressione equivalente a
select cast(cast(0x80000000 as binary(1)) as bit)
ma questo non è il caso. Invece, sembra che il più alto byte della costante binaria sia preso e convertito in bit. Così, in modo efficace è qualcosa di simile
select cast(cast(right(0x80000000, 1) as binary(1)) as bit)
Sono chiari con prima binary -> int -> bit
parte. Quello che non mi è chiaro è la seconda parte di binary -> bit
. Non ero in grado di trovare questo comportamento spiegato nel documentation, dove solo
Conversione in po promuove qualsiasi valore diverso da zero a 1.
si afferma.
Beh, sembra che cercare la risposta nei documenti di tipo 'bit' fosse il posto sbagliato, e invece dovrei farlo nei documenti' binary'. A rigor di termini il doc. la dichiarazione che hai citato riguarda _type -> binary_ conversion, dove la domanda riguarda _binary -> type_. IMO, supponendo che la conversione inversa abbia un comportamento simile (sebbene sia confermato nella pratica) ha un certo grado di implicità. Nonostante questo, e poiché doc non è abbastanza esplicito a riguardo, sto dando a questa risposta un segno di accettazione. Grazie per indicare il diverso troncamento a sinistra/destra/riempimento di char/binario e altri tipi. –
@ i-one In realtà, la conversione è reversibile per contratto, che funziona solo quando le stesse regole funzionano in entrambi i modi. Poiché type -> binary è definito, e type -> binary -> type è definito, binary -> type viene anche definito, purché venga utilizzata la stessa versione del server SQL. Ma stai già violando i problemi relativi alle versioni incrociate facendo in primo luogo qualsiasi conversione tra tipo binario e non stringa. – Luaan