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.