Načrtovanje in razvoj spletnih aplikacij

Podatkovni tipi

Naučili smo se že ustvariti, spremeniti in zbrisati tabelo. Do sedaj smo uporabili samo dva podatkovna tipa in sicer INT in VARCHAR(x). Poglejmo še ostale podatkovne tipe, ki jih lahko uporabljamo.

Osnovni tipi, ki jih uporabljamo so:

Številski podatkovni tipi

Najprej si oglejmo numerične vrednosti. Vsak numerični tip INT je lahko tudi:

  • UNSIGNED (nepredznačen)
  • AUTO_INCREMENT (samoštevilo)
  • ZEROFILL

Če je UNSIGNED, lahko zasede le pozitivne vrednosti, atribut AUTO_INCREMENT avtomatsko povečuje numerično vrednost natanko enemu polju v tabeli, ki mora imeti vsaj enega od atributov NOT NULL, PRIMARY KEY ali UNIQUE.

ZEROFILL zapolni začetek števila z ničlami in privzame še atribut UNSIGNED. To je uporabno npr. pri telefonskih številkah. Če bi imeli podatkovni tip INT(9) in bi vnesli telefonsko številko 041123456, bi se dejansko vneslo 41123456. Za pravilno shranjevanje zato uporabimo INT(9) ZEROFILL. Oznaka M pomeni največje število števk, D pa število mest za decimalno vejico.

Poleg vrednosti INT lahko uporabljamo še sledeče tipe:

Podatkovni tip Opis
BIT[(M)] Bitno polje. M pomeni število bitov v polju med 1 in 64. Privzeta vrednost za M je 1.
TINYINT[(M)] [UNSIGNED] [ZEROFILL] 1 bajt - uporabljamo ga, kadar zasede argument majhne vrednost. Lahko hrani števila med 0 in 255 (28-1), če je unsigned ali od -128 do 127. BOOL in BOOLEAN sta sinonima za TINYINT(1), kjer 0 pomeni narobe (false), neničelne vrednosti pa prav (true). Vrednost TRUE pomeni 1, FALSE pa 0.
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 2 bajta - primeren za števila od 0 do 65535 (216-1), če je unsigned ali od -32768 do 32767
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 3 bajte - zasede vrednosti od 0 do 16777215 (224-1), obratno niti ne bomo gledali, ker ni tako pomembno
INT[(M)] [UNSIGNED] [ZEROFILL]/td> 4 bajte - od 0 do 4294967295 (232-1). INTEGER je sinonim za INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL] 8 bajtov - razpon 0 do (264-1), se pa uporablja za ogromne vrednosti.
SERIAL je alias za BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
FLOAT[(M, D)] [UNSIGNED] [ZEROFILL] 4 bajte - realno število s plavajočo vejico, enojna natančnost. Npr. FLOAT(7,4) pomeni, da bodo števila prikazana v obliki -999.9999. MySQL izvede zaokroževanje pri shranjevanju podatkov, tako bi v našem primeru vnos števila 999.00009 zaokrožil na 999.0001.
DOUBLE(M, D) [UNSIGNED] [ZEROFILL] 8 bajtov - realno število s plavajočo vejico, dvojna natančnost. DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL] in REAL[(M,D)] [UNSIGNED] [ZEROFILL] sta sinonima za DOUBLE.
DECIMAL[(M[, D])] [UNSIGNED] [ZEROFILL] M+1 bajt ali M+2 bajta - realno število shranjeno kot niz, z določeno decimalno vejico. DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL] so sinonimi za DECIMAL.

Časovni podatkovni tipi

Oglejmo si podatkovne tipe za shranjevanje časa:

Podatkovni tip Opis
DATE Zasede 3 bajte v obliki YYYY-MM-DD: 2011-10-09 (Leto-Mesec-Dan)
TIME Zasede 3 bajte v obliki HH:MM:SS: 19:20:21 (Ura-Minuta-Sekunda)
DATETIME Zasede 8 bajtov v obliki YYYY-MM-DD HH:MM:SS: 2011-10-09 19:20:21 (Leto-Mesec-Dan Ura-Minuta-Sekunda)
TIMESTAMP Zasede 4 bajte v obliki YYYYMMDDHHMMSS; velja do konca leta 2037.: 20111009192021 (brez ločnic zapisan datum in čas)
YEAR[(2|4)] Zasede 1 ali 2 bajta v obliki YYYY ali YY: 2011 ali 11 (leto zapisano s štirimi števkami ima dovoljene vrednosti med 1901 in 2155 ter vrednost 0000 ali dvema števkama dovoljene vrednosti med 70 in 69 in predstavljajo leta med 1970 in 2069)

Primeri:

 SELECT CURDATE() CURRENT_DATE; 
 #Vrne: 2011-11-14 2011-11-14 

 SELECT CURTIME() CURRENT_TIME; 
 #Vrne: 09:37:34 09:37:34 

 SELECT CURRENT_TIMESTAMP SYSDATE() NOW(); 
 #Vrne: 2011-11-14 09:22:16 2011-11-14 09:22:16 2011-11-14 09:22:16

Zgornji primeri nam prikazuje uporabo funkcij, ki nam vrnejo trenutni datum in/ali čas. Kot vidimo imamo več možnosti za dosego istega rezultata.

Besedilni podatkovni tipi

Podatkovni tipi za shranjevanje nizov oziroma besedila

  • CHAR(x)
  • VARCHAR(x)

CHAR in VARCHAR sta podobna tipa podatkov za shranjevanje nizov znakov. Razlikujeta se v načinu shranjevanja in vračanja podatkov. Dolžina CHAR podatkovnega tipa je nespremenljiva in hrani toliko znakov, kot smo jih določili ob deklaraciji. Če nismo uporabili vseh znakov, se dopolni s presledki. Ko podatek tipa CHAR vrnemo pa le ta nima končnih presledkov. Tip VARCHAR pa hrani in vrača toliko znakov, kot smo jih uporabili. VARCHAR potrebuje še en ali dva bajta za informacijo o dolžini niza. Tipa zahtevata parameter x, ki pomeni maksimalno število znakov, ki jih lahko hranimo, lahko je od 0 do 255 za CHAR in od 0 do 65535 za VARCHAR.

Primer:

Vrednost CHAR(4) Poraba pomnilnika VARCHAR(4) Poraba pomnilnika
'' '  ' 4 bajte ' ' 1 bajt
'ab' 'ab  ' 4 bajte 'ab' 3 bajte
'abcč' 'abcč' 4 bajte 'abcč' 5 bajtov
'abcčdefg' 'abcč' 4 bajte 'abcč' 5 bajtov

Podatkovni tipi za shranjevanje dvojiških nizov znakov oziroma besedila

  • BINARY(x)
  • VARBINARY(x)

Sta podobna tipoma CHAR in VARCHAR le da vsebujeta dvojiške nize znakov namesto znakovnih. Podobnost je tudi v načinu shranjevanja in vračanja podatkov le da namesto presledkov BINARY tip dopolnimo z "0x00" oz. "\0". Parameter x, ki pomeni maksimalno število bajtov in ne znakov kot pri CHAR in VARCHAR, ki jih lahko hranimo, lahko je od 0 do 255 za BINARY in od 0 do 65535 za VARBINARY.

Primer:

 CREATE TABLE bin_test (c BINARY(3)); 
 INSERT INTO bin_test VALUES ('a'); 
 SELECT HEX(c), c = 'a', c = 'a\0\0' FROM bin_test;
  
 #Vrne:  HEX(c) c = 'a' c = 'a\0\0' 610000 0 1

Primer potrjuje, kar smo napisali zgoraj. Potem ko smo v polje s podatkovnim tipom BINARY(3) vnesli 'a', se je to polje dopolnilo na 'a\0\0'.

Podatkovni tipi za shranjevanje dvojiških nizov znakov oziroma besedila brez privzetih vrednosti (DEFAULT)

  • TEXT
  • BLOB

TEXT in BLOB tipi so zelo podobni VARCHAR in VARBINARY tipoma, le da ne moreta imeti privzetih (DEFAULT) vrednosti. TEXT torej shranjuje znakovne nize, BLOB pa dvojiške vrednosti. BLOB pomeni [B]inary [L]arge [OB]jects, torej veliki dvojiški objekti. BLOB tipi so primerni za shranjevanje vseh vrst datotek.

Poznamo štiri vrste TEXT in BLOB tipov:

  • TINYTEXT in TINYBLOB lahko hranita do 28=256 znakov oz. bajtov.
  • TEXT in BLOB do 216=65 536 znakov oz. bajtov, kar je 64 kilobajtov.
  • MEDIUMTEXT in MEDIUMBLOB 224=16 777 216 znakov oz. bajtov, kar je 16 megabajtov.
  • LONGTEXT in LONGBLOB pa 232sup>=4 294 967 296 znakov oz. bajtov, kar znaša 4 gigabajte.

Oštevilčenje

  • ENUM

ENUM (enumeration oz. oštevilčenje) uporabljamo, kadar želimo stolpcu prirediti eno izmed vnaprej določenih vrednosti (npr. velikost).

 CREATE TABLE enum_test ( velikost ENUM('majhno', 'srednje', 'veliko') ); 
 INSERT INTO enum_test (velikost) VALUES ('majhno'), ('veliko');

Vsako oštevilčenje ima svoj indeks oz. mesto za katerega velja, da se številčenje vrednosti začne s številko 1, prazna vrednost ('') ima številko 0, polje brez vrednosti (NULL) pa NULL. Indeks pri oštevilčenju nima nobene povezave z indeksi tabel. V našem primeru:

Vrednost Indeks
NULL NULL
'' 0
'majhno' 1
'srednje' 2
'veliko' 3

Množica

  • SET

SET (množica) je znakovno polje, ki lahko vsebuje nič ali več elementov iz vnaprej določene množice vrednosti, ki jih ločimo z vejico.

 CREATE TABLE set_test (korak SET('ena', 'dva')); 
 INSERT INTO set_test (korak) VALUES (''); 
 INSERT INTO set_test (korak) VALUES ('ena'); 
 INSERT INTO set_test (korak) VALUES ('dva'); 
 INSERT INTO set_test (korak) VALUES ('ena', 'dva'); 

Dan primer prikazuje tudi vse možne vrednosti polja korak.