Credo che la risposta sia che Oracle è molto, molto vecchio.
Ai vecchi tempi, prima che esistesse uno standard SQL, Oracle ha deciso di progettare lo svuotamento delle stringhe in VARCHAR
/VARCHAR2
le colonne erano NULL
e che c'era solo un senso di NULL (ci sono teorici relazionali che distinguerebbero tra dati che non sono mai stati richiesti, dati in cui la risposta esiste ma non è conosciuta dall'utente, dati in cui non c'è risposta, ecc. tutto di che costituiscono un senso di NULL
).
Quando lo standard SQL è arrivato e ha concordato che NULL
e la stringa vuota erano entità distinte, c'erano già utenti Oracle che avevano codice che presumeva che i due fossero equivalenti. Quindi a Oracle è stata sostanzialmente lasciata la possibilità di rompere il codice esistente, violare lo standard SQL o introdurre una sorta di parametro di inizializzazione che avrebbe cambiato la funzionalità di un numero potenzialmente elevato di query. La violazione dello standard SQL (IMHO) è stata la meno dirompente di queste tre opzioni.
Oracle ha lasciato aperta la possibilità che il VARCHAR
il tipo di dati cambierebbe in una versione futura per aderire allo standard SQL (motivo per cui tutti usano VARCHAR2
in Oracle poiché è garantito che il comportamento di quel tipo di dati rimarrà lo stesso in futuro).