sql >> Databasteknik >  >> RDS >> Oracle

Är denna implementering SQL-92-konform?

Nej, Oracles behandling av nollor är idiosynkratisk, annorlunda än alla andras och oförenlig med ANSI-standarderna. Till Oracles försvar har det troligtvis löst sig och var engagerat i denna behandling långt innan det fanns en ANSI-standard att vara förenlig med!

Allt utgår från det faktum att Oracle lagrar strängar med ett teckenantal följt av strängdata. En NULL representeras av ett teckenantal på noll utan följande strängdata - vilket är exakt samma som en tom sträng (''). Oracle har helt enkelt inte ett sätt att skilja dem åt.

Detta leder till en del udda beteende, som det här sammankopplingsfallet. Oracle har också en funktion LENGTH för att returnera längden på en sträng, men denna har definierats på ett motsatt sätt, så att LENGTH('') returnerar NULL inte noll. Så:

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

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

vilket förefaller mig bryta mot grundläggande matematiska principer.

Naturligtvis har Oracle-utvecklare blivit så vana vid detta att många av oss inte ens kan se något fel eller konstigt med det - vissa kommer faktiskt att hävda att resten av världen har fel och att en tom sträng och en NULL är samma sak!



  1. PHP-skript för att logga rådata för POST

  2. Sökningen visar alla produkter

  3. Välja en del av ett fält med ett regex

  4. PHP:Varning:sort() förväntar sig att parameter 1 är array, resurs given