sql >> Databáze >  >> RDS >> Oracle

Je tato implementace v souladu s SQL-92?

Ne, zacházení Oracle s nulami je svérázné, odlišné od všech ostatních a není v souladu se standardy ANSI. Na obranu společnosti Oracle se však pravděpodobně usadil a zavázal se k tomuto zacházení dlouho předtím, než existoval standard ANSI, který by měl být v souladu!

Vše začíná tím, že Oracle ukládá řetězce s počtem znaků následovaným daty řetězce. NULL je reprezentován počtem znaků nula bez následujících dat řetězce - což je přesně totéž jako prázdný řetězec (''). Oracle prostě nemá způsob, jak je rozlišit.

To vede k nějakému zvláštnímu chování, jako je tento případ zřetězení. Oracle má také funkci LENGTH, která vrací délku řetězce, ale ta byla definována opačným způsobem, takže LENGTH('') vrací NULL, nikoli nulu. Takže:

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

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

což se mi zdá porušovat základní matematické principy.

Vývojáři Oracle si na to samozřejmě tak zvykli, že mnozí z nás na tom ani nevidí nic špatného nebo zvláštního – někteří budou ve skutečnosti namítat, že zbytek světa se mýlí a že prázdný řetězec a NULL jsou to samé!



  1. SQL jednoduchá obsluha pro začátečníky

  2. mysql_escape_string celé pole příspěvků?

  3. Jak získat přístup k připojení mysqli v jiné třídě na jiné stránce?

  4. Zjistit a zpracovat, když se databázový dotaz pokazí