programmera.net -> oracle -> normal     för utskrift      info@programmera.net

Datatyper i Oracle

1. Översikt
2. NUMBER
3. Heltal=NUMBER(n)
4. Decimaltal=NUMBER(n,m)
5. FLOAT
6. VARCHAR2 och CHAR
7. DATE och TIMESTAMP

1. Översikt

Nedan listas alla datatyper i Oracle:

Datatyper Maxlängd Typ Beskrivning
NUMBER(n[,m])  38 Siffror/Byte  Tal  Innehåller ett tal. Variablerna n och m bestämmer den maximala storleken på talet, se nedan. m är från -84 till 127.
FLOAT(n)  126 Byte  Flyttal  Innehåller ett flyttal. Variablerna n bestämmer med vilken noggrannhet talet ska sparas.
DATE  7 Byte  Datum  Innehåller ett datum. Ett datum är alltid 7 Byte stort.
TIMESTAMP(n)   7 Byte  Datum  Innehåller ett datum. Ett datum är alltid 7 Byte stort.
CHAR(n)  2 KB  Text  Innehåller text som har längden n bytes (där n<2000).
NCHAR(n)  2 KB  Text  Innehåller Unicodetext som har längden n bytes.
VARCHAR2(n)  4 KB  Text  Innehåller text av variabel längd upp till n bytes (där n<4000).
NVARCHAR2(n)  4 KB  Text  Innehåller Unicodetext av variabel längd upp till n bytes (där n<4000).
LONG  2 GB  Text  Innehåller text av variabel längd upp till 2 GB, lagras inline.
CLOB  4 GB  Text  Innehåller text av variabel längd upp till 4 GB, lagras utanför tabellen.
NCLOB  4 GB  Text  Innehåller Unicodetext av variabel längd upp till 4 GB, lagras utanför tabellen.
RAW  2 KB  Binärdata  Innehåller binärdata av variabel längd upp till 2 KB.
LONG RAW  2 GB  Binärdata  Innehåller binärdata av variabel längd upp till 2 GB, lagras inline.
BLOB  4 GB  Binärdata  Innehåller binärdata av variabel längd upp till 4 KB, lagras utanför tabellen.
BFILE  -  Pekare  Innehåller pekare till stora operativsystemfiler utanför Oracle.
ROWID  -  Pekare  Innehåller den fysiska hårddiskadressen till den aktuella tabellraden. Denna variabel finns automatiskt i alla tabeller.

2. NUMBER

Denna datatyp ersätter alla traditionella heltalstyper och flyttalstyper i ANSI-SQL. Beroende på om man har ett komma med i definitionen eller inte får man heltal respektive flyttal. Skriver man inget tal inom parantes får man ett heltal på max 38 siffror.

3. Heltal=NUMBER(n)

Om man specifierara ett tal inom parantes får man ett heltal på max n antal värdesiffror. Låt oss säga att vi har följande tabell:
SQL> DESC person
Name                    Null?    Type
-------------------- -------- --------------
WEIGHT                        NUMBER(3)
Kolumn "weight" i tabellen "person" kan innehålla heltal av max 3 siffrors längd. Följande sats går bra:
SQL> INSERT INTO person (weight) VALUES (123);
1 row created.
Medan nedanstående sats inte fungerar alls:
SQL> INSERT INTO person (weight) VALUES (1234);
INSERT INTO person (weight) VALUES (1234)
                                 *
ERROR at line 1:
ORA-01438: value larger than specified precision allows
 for this column

4. Decimaltal=NUMBER(n,m)

Om man specifierara två tal inom parantes får man ett decimaltal på totalt n antal värdesiffror, där m siffror hamnar bakom decimaltecknet. 1 < n < 38 och -84 < m < 127. Låt oss säga att vi har följande tabell:
SQL> DESC person
Name                    Null?    Type
-------------------- -------- --------------
WEIGHT                        NUMBER(5,2)
Kolumn "weight" i tabellen "person" kan innehålla flyttal med max 3 siffror före decimaltecknet och max 2 bakom. Följande sats går bra:
SQL> INSERT INTO person (weight) VALUES (123.12);
1 row created.
Även nedanstående sats går bra:
SQL> INSERT INTO person (weight) VALUES (567.123);
1 row created.
Oracle protesterar alltså inte när man försöker lägga till för många decimaler, men endast de två första kommer att lagras.

5. FLOAT

Ett flyttal deklareras med float. Man kan själv välja hur många bytes man vill att flyttalet ska ha genom att speca det inom parantes. Skriver man inget får man full precision (126 bytes):
SQL> CREATE TABLE float_test(
	f1 FLOAT(3),
	f2 FLOAT
);

Table created.
SQL> DESC float_test;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------

 F1                                                 FLOAT(3)
 F2                                                 FLOAT(126)

Vi testar för att se hur många decimaler som sparas i de två olika kolumnerna:
SQL> INSERT INTO float_test VALUES(1.23456789, 1.23456789);

1 row created.

SQL> SELECT * FROM float_test;

        F1         F2
---------- ----------
         1 1.23456789
Här ser vi att skapa ett flyttal på 3 bytes inte var någon bra idé.

6. VARCHAR2 och CHAR

Text lagras oftast i typerna VARCHAR2 och CHAR:

  • Med typen VARCHAR2(n) lagrar man strängar av variabel längd upp till det tal n som ges då kolumnen skapas. n måste anges och måste vara mindre än 4000.
  • Typen CHAR(n) lagrar exakt n tecken. Om strängen som ska INSERT-as i tabellen är kortare än n så läggs mellanslag till på slutet så att längden blir n. Defaultvärdet för n är 1.
Vi testar detta:
SQL> CREATE TABLE xxio.xxio_i69_char_test(
	vc1 VARCHAR2(5),
	c1 CHAR(5)
);

Table created.

SQL> INSERT INTO char_test VALUES('Hej','Hej');

1 row created.

SQL> SELECT '*'|| vc1 || '*', '*' || c1 || '*' FROM char_test;

'*'||VC '*'||C1
------- -------
*Hej*   *Hej  *

Ovan såg vi att det som lagras i CHAR-kolumnen är en sträng med 5 tecken (där 2 tecken är blanktecken). Man kan kolla hur många bytes som strängarna förbrukar med VSIZE:
SQL>  SELECT VSIZE(vc1), VSIZE(c1) FROM char_test;

VSIZE(VC1)  VSIZE(C1)
---------- ----------
         3          5

Vi ser att vi får samma resultat här, typen VARCHAR2 verkar bara konsumera 3 bytes. Hur många bytes en text tar upp beror på vilken teckenuppsättning du har i databasen. Exempel: UTF16 konsumerar alltid 2 bytes per tecken.

7. DATE och TIMESTAMP

Det finns två datatyper som lagrar tid:

  • DATE: Lagrar datum och tid som antalet dagar sedan den 31 December, 4713 före kristus. Datum lagras som ett heltal, vilket underlättar operationer på datum, som t.ex. jämförelse och sortering.
  • TIMESTAMP: Lagrar datum och tid och ibland tidszon. TIMESTAMP är en nyhet för Oracle 9i. Det finns färre funktioner för TIMESTAMP än det finns för DATE (se  Datumfunktioner ).
Ett exempel:
SQL> CREATE TABLE date_test (
	dt DATE,
	ts1 TIMESTAMP,
	ts2 TIMESTAMP(2)
);

Tabellen är skapad.

SQL> DESC date_test;
 Namn                                      Null?    Typ
 ----------------------------------------- -------- ----------------------------
 DT                                                 DATE
 TS1                                                TIMESTAMP(6)
 TS2                                                TIMESTAMP(2)

SQL> INSERT INTO date_test VALUES( sysdate, systimestamp,systimestamp);

1 rad är skapad.

SQL> SELECT * FROM date_test;

DT         TS1                            TS2
---------- ------------------------------ ------------------------------
2005-01-19 2005-01-19 01:25:57,933000     2005-01-19 01:25:57,93


SQL> SELECT VSIZE(DT), VSIZE(TS1), VSIZE(TS2) FROM date_test;

 VSIZE(DT) VSIZE(TS1) VSIZE(TS2)
---------- ---------- ----------
         7         11         11

Vi ser att en TIMESTAMP kostar lika många bytes oavsett hur många sekunddecimaler vi väljer att spara.