sql >> Database teknologi >  >> RDS >> Oracle

Hvorfor har Oracle varchar2 en obligatorisk størrelse som definitionsparameter?

Nej, det er slet ikke det samme.

  1. Længden af ​​kolonnen er nyttige metadata for udviklere, der bygger skærmbilleder.
  2. På samme måde bruger automatiske forespørgselsværktøjer som TOAD og SQL Developer længden af ​​kolonnen, når de gengiver resultater.
  3. Databasen bruger længden af ​​en variabel, når den allokerer hukommelse til PL/SQL-samlinger. Efterhånden som den hukommelse kommer ud af PGA'en, kan en overstørrelse af variabeldeklarationen føre til, at programmer fejler, fordi serveren er løbet tør for hukommelse.
  4. Der er lignende problemer med deklarationen af ​​enkelte variable i PL/SQL-programmer, det er bare, at samlinger har en tendens til at multiplicere problemet.
  5. Overstore kolonner skaber problemer for sammensatte indekser. Følgende er på en database med 8K blokke

....

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 frem for alt andet er kolonnestørrelser en form for fejlkontrol. Hvis kolonnen formodes at være ti tegn lang, og en eller anden autonom proces forsøger at indlæse tusind tegn, er der noget galt. Processen burde mislykkes, så vi kan undersøge, hvorfor vi indlæser duff-data. Alternativet er en database fuld af skrald, og hvis det var det, vi ønskede, skulle vi bare have givet alle Excel og være færdige med det.

Det er rigtigt, at det kan være trættende at ændre kolonnestørrelsen, når det viser sig, at vi har undervurderet. Men det sker ikke særlig tit, og vi kan afbøde meget af smerten ved at bruge %TYPE- og SUBTYPE-deklarationer i vores PL/SQL i stedet for hårdkodning af variable længder.

Tallene er forskellige. Til at begynde med er den maksimale størrelse af et tal meget mindre end tekstækvivalenten (38 cifre med garanteret præcision).

Men den vigtigste forskel er, at Oracle gemmer numeriske værdier i videnskabelig notation så der er ikke et ligetil forhold mellem den aritmetiske størrelse af tallet og den lagerplads, det bruger.

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> 

Ikke desto mindre er det fortsat god praksis at specificere skala og præcision, hvor det er muligt, især når vi har at gøre med heltal, f.eks. eller penge.



  1. Er der nogen klasse i MySql, der ligner BulkCopy Class i SQL Server 2005

  2. Kontroller, at tabellen eksisterer eller ej, før du opretter den i Oracle

  3. Hvordan får jeg OR til SUM(IF()) MySQL

  4. Udefineret indeks:brugernavn i C:\wamp\www\Website\storeadmin\admin_login.php..og det samme for adgangskode