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

Oracle non distingue tra valori null e stringhe vuote?

Oracle è molto molto molto vecchio.

Di nuovo negli 80's quando è stato sviluppato (e prima che esistessero degli standard) hanno pensato che fosse una buona idea, e poi hanno dato il via a Oracle memorizza i suoi valori, lo era davvero.

Ecco come Oracle memorizza i dati (presi dalla documentazione ):

Nessun tipo di dati viene memorizzato all'interno dei dati, solo la lunghezza dei dati e i dati stessi.

Se il NULL si verifica tra due colonne con valori, è memorizzato come un singolo byte, il che significa che la colonna ha lunghezza 0 (in realtà, 0xFF ). NULL finale i messaggi non vengono affatto memorizzati.

Quindi per memorizzare il valore 'test' , Oracle deve memorizzare 5 byte:04 74 65 73 74 .

Tuttavia, per memorizzare sia una stringa vuota che un NULL , Oracle deve solo impostare la lunghezza dei dati su 0 .

Molto intelligente se i tuoi dati devono essere archiviati su 20 Mb dischi rigidi che costano 5,000$ ciascuno.

Più tardi, quando sono apparsi gli standard, non era più una buona idea, ma a quel punto c'era già un sacco di codice che si basava su NULL e '' essere la stessa cosa.

Fare VARCHAR fare una tale distinzione spezzerà tonnellate di codice.

Per risolverlo, hanno rinominato VARCHAR a VARCHAR2 (che non fa parte di nessuno standard), ha affermato che VARCHAR2 mai distinguere tra un NULL e una stringa vuota e ha invitato tutti a utilizzare invece questo tipo di dati.

Ora stanno probabilmente aspettando l'ultima persona che ha usato un VARCHAR in Oracle database a morire.