sql >> Databasteknik >  >> RDS >> Oracle

Varför har Oracle varchar2 en obligatorisk storlek som definitionsparameter?

Nej, det är inte alls samma sak.

  1. Längden på kolumnen är användbar metadata för utvecklare som bygger skärmar.
  2. På liknande sätt använder automatiska frågeverktyg som TOAD och SQL Developer längden på kolumnen när de renderar resultat.
  3. Databasen använder längden på en variabel vid allokering av minne för PL/SQL-samlingar. När det minnet kommer ut från PGA:n kan variabeldeklarationen leda till att program misslyckas eftersom servern har slut på minne.
  4. Det finns liknande problem med deklarationen av enskilda variabler i PL/SQL-program, det är bara att samlingar tenderar att multiplicera problemet.
  5. Överstora kolumner skapar problem för sammansatta index. Följande finns på en databas med 8K-block

....

SQL> create table t23 (col1 varchar2(4000), col2 varchar2(4000))
  2  /

Table created.

SQL> create index t23_i on t23(col1,col2)
  2  /
create index t23_i on t23(col1,col2)
                      *
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded


SQL>

Men framför allt är kolumnstorlekar en form av felkontroll. Om kolumnen är tänkt att vara tio tecken lång och någon autonom process försöker ladda tusen tecken så är något fel. Processen borde misslyckas, så vi kan undersöka varför vi laddar duff-data. Alternativet är en databas full av skräp, och om det var vad vi ville skulle vi bara ha gett alla Excel och ha gjort det.

Det är sant att det kan vara tröttsamt att ändra kolumnstorleken när det visar sig att vi har underskattat. Men det händer inte så ofta, och vi kan lindra mycket av smärtan genom att använda %TYPE- och SUBTYPE-deklarationer i vår PL/SQL istället för att hårdkoda variabla längder.

Siffrorna är olika. Till att börja med är den maximala storleken på ett nummer mycket mindre än textmotsvarigheten (38 siffror med garanterad precision).

Men den viktigaste skillnaden är att Oracle lagrar numeriska värden i vetenskaplig notation så det finns inget okomplicerat förhållande mellan den aritmetiska storleken på numret och det lagringsutrymme som det förbrukar.

SQL> select vsize(123456789012345678901) n1
  2         , vsize(999999999999999999999999999999) n2
  3         , vsize(0.000000000000000000001) n3
  4         , vsize(1000000000000000000000000) n4
  5  from dual
  6  /

        N1         N2         N3         N4
---------- ---------- ---------- ----------
        12         16          2          2

SQL> 

Ändå är det fortfarande god praxis att specificera skala och precision när det är möjligt, särskilt när vi har att göra med heltal, till exempel, eller pengar.



  1. jQuery uppdatera div i samma ögonblick som en tabell uppdateras

  2. PostgreSQL-installation på Docker

  3. Eliminerar MySQL vanliga underuttryck mellan SELECT och HAVING/GROUP BY-satsen

  4. hur man matchar två rader av mysql samma tabell i php