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:
Kolumn "weight" i tabellen "person" kan innehålla heltal av max 3 siffrors längd. Följande sats går bra:
SQL> DESC person
Name Null? Type
-------------------- -------- --------------
WEIGHT NUMBER(3)
Medan nedanstående sats inte fungerar alls:
SQL> INSERT INTO person (weight) VALUES (123);
1 row created.
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:
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> DESC person
Name Null? Type
-------------------- -------- --------------
WEIGHT NUMBER(5,2)
Även nedanstående sats går bra:
SQL> INSERT INTO person (weight) VALUES (123.12);
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.
SQL> INSERT INTO person (weight) VALUES (567.123);
1 row created.
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):
Vi testar för att se hur många decimaler som sparas i de två olika kolumnerna:
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)
Här ser vi att skapa ett flyttal på 3 bytes inte var någon bra idé.
SQL> INSERT INTO float_test VALUES(1.23456789, 1.23456789);
1 row created.
SQL> SELECT * FROM float_test;
F1 F2
---------- ----------
1 1.23456789
6. VARCHAR2 och CHAR
Text lagras oftast i typerna VARCHAR2 och CHAR:
Vi testar detta:
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> 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 *
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.
SQL> SELECT VSIZE(vc1), VSIZE(c1) FROM char_test;
VSIZE(VC1) VSIZE(C1)
---------- ----------
3 5
7. DATE och TIMESTAMP
Det finns två datatyper som lagrar tid:
Ett exempel:
Vi ser att en TIMESTAMP kostar lika många bytes oavsett hur många sekunddecimaler vi väljer att spara.
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