Oracle
 sql >> Database >  >> RDS >> Oracle

Questa implementazione è conforme a SQL-92?

No, il trattamento dei null da parte di Oracle è idiosincratico, diverso da quello di chiunque altro e incoerente con gli standard ANSI. A difesa di Oracle, tuttavia, probabilmente si è deciso e si è impegnato in questo trattamento molto prima che esistesse uno standard ANSI con cui essere coerente!

Tutto parte dal fatto che Oracle memorizza le stringhe con un conteggio dei caratteri seguito dai dati della stringa. Un NULL è rappresentato da un numero di caratteri pari a zero senza i seguenti dati di stringa, che è esattamente lo stesso di una stringa vuota (''). Oracle semplicemente non ha modo di distinguerli.

Ciò porta ad alcuni comportamenti bizzarri, come questo caso di concatenazione. Oracle ha anche una funzione LENGTH per restituire la lunghezza di una stringa, ma questa è stata definita in modo opposto, in modo che LENGTH('') restituisca NULL diverso da zero. Quindi:

LENGTH('abc') + LENGTH('') IS NULL

LENGTH('abc' || '') = 3

che mi sembra violare i principi matematici di base.

Ovviamente, gli sviluppatori Oracle sono così abituati a questo che molti di noi non riescono nemmeno a vedere nulla di sbagliato o strano al riguardo - alcuni infatti sosterranno che il resto del mondo è sbagliato e che una stringa vuota e un NULL sono la stessa cosa!