sql >> Databasteknik >  >> RDS >> Oracle

Oracle skiljer inte mellan nollor och tomma strängar?

Oracle är väldigt väldigt väldigt gammal.

Tillbaka i 80's när det utvecklades (och innan det fanns några standarder) tyckte de att det var en bra idé, och givet då Oracle lagrar sina värden, det var det verkligen.

Så här gör du Oracle lagrar data (hämtad från dokumentationen ):

Ingen datatyp lagras i datan, bara datalängden och själva datan.

Om NULL förekommer mellan två kolumner med värden, den lagras som en enda byte vilket betyder att kolumnen har längden 0 (faktiskt 0xFF ). Efterföljande NULL s lagras inte alls.

Så för att lagra värdet 'test' , Oracle behöver lagra 5 byte:04 74 65 73 74 .

Men att lagra både en tom sträng och en NULL , Oracle behöver bara ställa in datalängden till 0 .

Väldigt smart om din data ska lagras på 20 Mb hårddiskar som kostar 5,000$ varje.

Senare, när standarderna dök upp, var det inte så bra längre, men vid den tiden fanns det redan massor av kod som förlitade sig på NULL och '' är samma sak.

Gör VARCHAR att göra en sådan distinktion kommer att gå sönder ton kod.

För att fixa det döpte de om VARCHAR till VARCHAR2 (som inte är en del av någon standard), angav att VARCHAR2 kommer aldrig skilja mellan en NULL och en tom sträng och uppmanade alla att använda denna datatyp istället.

Nu väntar de förmodligen på den sista personen som använde en VARCHAR i Oracle databas att dö.



  1. SQL Server-markörtyper - Dynamisk markör | SQL Server Tutorial / TSQL Tutorial

  2. MySQL välj en kolumn DISTINCT, med motsvarande andra kolumner

  3. Välj värden från XML-fältet i SQL Server 2008

  4. Hur man sammanfogar två tabeller med hjälp av en kommaseparerad lista i sammanfogningsfältet