sql >> Database >  >> RDS >> Oracle

Is deze implementatie SQL-92 conform?

Nee, Oracle's behandeling van nulls is eigenzinnig, anders dan die van alle anderen, en inconsistent met de ANSI-normen. Ter verdediging van Oracle echter, heeft het waarschijnlijk genoegen genomen met en toegewijd aan deze behandeling lang voordat er een ANSI-standaard was om in overeenstemming te zijn met!

Het begint allemaal met het feit dat Oracle strings opslaat met een karaktertelling gevolgd door de stringgegevens. Een NULL wordt weergegeven door een tekentelling van nul zonder volgende tekenreeksgegevens - wat precies hetzelfde is als een lege tekenreeks (''). Oracle heeft gewoon geen manier om ze te onderscheiden.

Dit leidt tot eigenzinnig gedrag, zoals dit aaneenschakelingsgeval. Oracle heeft ook een functie LENGTH om de lengte van een string te retourneren, maar dit is op een tegenovergestelde manier gedefinieerd, zodat LENGTH('') NULL en niet nul retourneert. Dus:

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

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

wat mij lijkt in strijd met wiskundige basisprincipes.

Natuurlijk raken Oracle-ontwikkelaars hier zo aan gewend dat velen van ons er zelfs niets verkeerds of vreemds aan kunnen zien - sommigen zullen zelfs beweren dat de rest van de wereld ongelijk heeft en dat een lege string en een NULL zijn hetzelfde!



  1. SQL cumulatieve telling

  2. MAAK een tabel met datumtype en gebruik de standaardwaarde als CURRENT_DATE op MySQL

  3. MySQL:fout 150 bij gebruik van ON UPDATE SET NULL en ON DELETE SET NULL, waarom?

  4. Sql Developer kan Oracle Database 12c verbinden met TNS maar kan niet verbonden worden met basic