Da bismo stavili podatke u bazu, potrebne su nam tabele. One prihvataju podatke na nivou redova i kolona. Jedna kolona sadrži jedan tip podatka.
Na primer:
redniBroj ime datumRođenja
1 Petar 01-01-1980
2 Jovan 01-01-1970
Očigledno je da ove tri kolone skladište i tri različita tipa podataka. U prvoj koloni (redniBroj) skladište se samo brojevi. U drugoj koloni (ime) tekst, a u trećoj (datumRođenja) datumi.
Ovo i jeste generalna podela tipova u MySQL-u na: brojeve (numeričke tipove), tekst (stringove) i datume (datetime). Ali, ovi tipovi imaju mnoštvo podtipova i upravo se na rukovanju tim podkategorijama bazira dobra tabelarna konstrukcija u MySQL-u i bazama podataka uopšte.
Recimo, redni broj u prethodnom primeru jeste numerički tip, ali koliki? Ukoliko ne očekujemo više od dve osobe u listi, onda nam nije ni potrebno više od dva broja (1 i 2), ali ako očekujemo milione osoba, onda nam je potrebno mnogo više brojeva i samim tim numerički tip kolone mora biti veći.
Zamislite sada da je tip kolone takav da može da prihvati milione rednih brojeva (a da i dalje imamo samo dve osobe u listi). MySQL bi imao rezervisan prostor u memoriji, za nešto što nikada neće ispuniti taj prostor. Ili, zamislite da naša tabela ima mogućnost prihvatanja samo dve osobe, a pojave se milioni. Tabela, jednostavno, neće biti u stanju da prihvati te podatke.
Isto važi i za tekstualne tipove (stringove). U jednoj koloni možemo očekivati određenu količinu karaktera po polju. Sadžaj polja može biti, na primer, da ili ne, što je, u bilo kom slučaju – dva karaktera. Ali, može biti i ogroman tekst od više hiljada karaktera. Za oba slučaja, potrebne su nam različite veličine polja, odnosno, kolona.
Bitno je znati da MySQL server nije „taj” koji se pita za tipove podataka sa kojima će rukovati. Za to su zaduženi mehanizmi skladištenja. Da li to znači da različiti mehanizmi skladištenja prihvataju različite tipove? Da i ne.
Većina tipova podataka u mehanizmima skladištenja i bazama podataka se poklapaju (na primer, svaka baza podataka poznaje tip int). Istina je da nemaju sve baze (kao ni svi mehanizmi skladištenja MySQL servera) sve tipove, ali generalno, većina osnovnih tipova je uvek prisutna.
Numerički tipovi podataka
Numerički tipovi su tipovi koji prihvataju isključivo brojne vrednosti, bilo da su u pitanju celi brojevi ili brojevi sa decimalnim zarezom.
Najpoznatiji numerički tip je svakako int (integer). Ovo je celobrojni tip koji može prihvatiti vrednost od -2147483648 do 2147483648 ukoliko je označen ili od 0 do 4294967295 ako je neoznačen. Označeni brojevi su oni koji mogu imati i negativnu vrednost, dok neoznačeni prihvataju samo pozitivnu. Ovaj tip ima četiri bajta, što znači da njegovu maksimalnu veličinu dobijamo tako što izbrojimo bajtove i pomnožimo sa brojem bita (jedan bajt sadrži osam bita), a onda sve to stavimo kao eksponent broju dva.
Na primer:
int prihvata 4 bajta. Dakle, 4 bajta puta 8 bita je 32 bita. Dva na tridesetdrugi je 4294967295.
Pogledajmo ostale varijacije tipa int:
-
tinyint – 1 bajt : od -128 do 128 (neoznačeno do 256)
-
smallint – 2 bajta : od -32768 do 32767 (neoznačeno do 65535)
-
mediumint – 3 bajta : od -8388608 do 8388607 (neoznačeno do 16777215)
-
bigint – 8 bajtova : od -9223372036854775808 do -9223372036854775807 (neoznačeno do 18446744073709551615)
Prilikom inicijalizacije ovih tipova u tabeli, moguće je dodati im i neke karakteristike vezane za samo prikazivanje. Možete im ograničiti kolčinu prikazanih cifara:
int(2)
…će prikazivati samo dve cifre od kompletnog broja (iako će u memoriji biti uskladišten ceo broj).
- zerofill – dodaje nule kako bi se dopunio broj, do željenog broja cifara. Na primer, ako je tip int(5), a uneta vrednost 1, konačni broj će biti 00001.
- unsigned – postavljamo ovu opciju, ukoliko želimo da broj bude neoznačen. U tom slučaju, broj ne može biti negativan.
Osim celih, MySQL poznaje i brojeve sa pokretnim zarezom. Ovde razlikujemo nekoliko tipova. Float, decimal double i bit.
Float
Ovo je osnovna verzija broja sa pokretnim zarezom, koja podrazumeva jednostruku preciznost. Ova preciznost obezbeđuje četiri bajta za vrednost.
2.3
100,45
Float takođe prihvata parametre, pri čemu je moguće formatirati format decimalnog zapisa.
Na primer:
ako kao tip stavimo float(6,2), vrednost 1525 biće emitovana kao 1525.00 (dakle, prvi broj je broj cifara, dok je drugi broj, broj decimala).
Na isti način funkcionišu i tipovi double i real, s tim što imaju veličinu od 8 bajtova i duplo veću preciznost. Decimal rukuje brojevima sa maksimalnom preciznošću i mora prihvatiti parametre.
Na primer:
decimal(5,2)
Ovaj broj prihvatiće broj do pet cifara, koji može imati do dve decimale. Dakle, ako unesemo broj 123.45, biće prihvaćen. Broj 123 će biti zapisan u bazu sa dodatnim decimalama (123.00), dok će broj 123.119 biti zapamćen kao 123.12. Brojevi preko pet cifara neće biti prihvaćeni i server će prijaviti grešku.
Maksimalan broj cifara u decimal tipu je 65, pri čemu, sa desne strane zareza može biti ne više od 30 cifara (decimal(65,30)).
Bit
Ovo je tip koji služi za skladištenje jednobitne vrednosti 1 ili 0. Kažemo „služi za”, zato što ovaj tip nije uistinu jednobitni tip, već samo tako reprezentuje podatak. Ovaj tip isprva je bio skladišten u bazi kao tinyint(1), da bi od verzije 5.0.3 MySQL-a postao zaseban binarni tip.
Tip bit služi isključivo za skladištenje logičke vrednosti (true ili false, 1 ili 0, isključeno ili uključeno), pa tako može prihvatiti ili brojnu vrednost (1 / 0) ili Boolean vrednost (true / false).
Tekstualni tipovi – stringovi
MySQL poznaje pet tekstualnih tipova: char, binary, blob, enum i set, od kojih se najviše koriste char i blob.
char/varchar
Ovo je tip koji se veoma često koristi. U pitanju je tip koji prihvata niz karaktera (bajtova). Pri kreiranju prihvata parametar koji označava koliko će bajtova prihvatati kolona, odnosno polje:
char(5)
Ovaj tip prihvata pet karaktera i zauzima isto toliko bajtova (odnosno, duplo, ukoliko su u pitanju unicode karakteri).
To znači da, kada napravimo ovakav tip i u njega smestimo vrednost ‘x’, on će tu vrednost u bazi upamtiti kao x, ali će ipak zauzeti i prostor u memoriji za ostala 4 karaktera:
varchar(5)
Ovako definisan tip takođe prihvata do 5 bajtova/karaktera, ali pri tom, ukoliko karaktera ima manje od pet, biće zauzeto prostora u memoriji samo za toliko koliko iznose podaci:
‘a’ = 1 bajt
‘abcde’ = 5 bajtova
binary/varbinary
Ovaj tip podatka funkcioniše isto kao i char i varchar, ali, umesto kao nizove karaktera, on stringove beleži kao binarne vrednosti, zbog čega ne postoji kontrola nad kodnim rasporedima i sortiranju:
varbinary(5)
blob (binary large object)/text
Ova dva tipa možete shvatiti kao neku vrstu nadogradnje char i binary tipova. Njih koristimo ukoliko želimo da rukujemo sa stvarno velikim vrednostima. Osnovna razlika između blob/text i binary/char je u tome što blob i text ne smeštaju vrednost u tabele u kojima se nalaze, već u zasebna skladišta (takođe tabele, ali nevidljive). Zbog toga, umesto 65535 bajtova, koliko mogu prihvatiti char i binary tipovi, ovaj tip može prihvatiti mnogo veće podatke.
Blob i text takođe imaju podtipove:
-
tinytext / tinyblob – 255 karaktera/bajtova
-
text / blob – 65535 karaktera/bajtova
-
mediumtext / mediumblob – 16,777,215 karaktera/bajtova
-
longtext / longblob – 4,294,967,295 karaktera/bajtova
Ne zaboravite da ove veličine ne važe ukoliko koristite unicode karaktere. U tom slučaju, ove količine se smanjuju duplo (jer je veličina jednog unicode karaktera dva bajta).
Enum
Enum je tip koji prihvata samo neku od vrednosti unapred definisanu u definiciji samog tipa:
enum(‘januar’, ‘februar’, ‘mart’, ‘april’, ‘maj’, ‘jun’)
Ako je kolona ovako definisana, vrednost u polju može biti samo jedan od navedenih meseci. Ovo je zapravo niz vrednosti i svaka od njih je indeksirana određenim brojem, pa se vrednosti iz liste mogu prezentovati i brojevima. Ali, i pored toga, ponavljanje vrednosti u listi nije dozvoljeno.
Jedan enum tip može prihvatiti do 65,535 vrednosti.
Set
Ovaj tip funkcioniše slično enum-u, ali, za razliku od njega, jedna vrednost može sadržati više od jedne.
Na primer, ako je definicija kolone:
set(‘a’,’b’)
Onda vrednost te kolone može biti:
‘a’
ili
‘b’
ili
‘a’,’b’
ali, ukoliko postavimo vrednost na ‘a’,’b’,’b’,’b’ ili sličnu (u kojoj dolazi do ponavljanja članove), vrednost će i dalje biti: ‘a’,’b’.
Datum
U MySQL-u razlikujemo pet tipova za rukovanje vremenom: date, datetime, time, timestamp i year.
Date
Podrazumeva sve datume od prvog januara hiljadite godine do 31. decembra 9999. godine. Kada jednom definišemo kolonu, vrednost možemo uneti kroz dva različita tipa. Datum (na primer funkcijom curdate()) ili string (2009-10-02).
Datetime
Tip funkcioniše slično kao date, s tim što može da prihvati i vreme za određeni datum. Takođe može prihvatiti vrednost kroz ekvivalentan tip (na primer funkcijom now()) ili stringom (‘GGGG-MM-DD SS:MM:ss’).
Timestamp
Ovaj tip predstavlja broj sekundi koje su protekle od prvog januara 1970. godine. Ovaj tip se često koristi za merenje vremena neke operacije.
Time
Prihvata vreme od -838:59:59 do 838:59:59 po šemi SS:MM:ss. Kao i ostali formati datuma i ovaj tip može prihvatiti vrednost „zapakovanu” u string.
Year
Konačno, ovaj tip predstavlja godinu (u zavisnosti od parametra pri definiciji) u periodu od 1901 – 2155. Vrednost može biti uneta u vidu stringa ili datuma.
Tipovi podataka – Vežbe
Vežba 1
Problem:
Potrebno je kreirati tabelu sa imenima i prezimenima korisnika, matičnim brojem, brojem telefona, šifrom i e-mail-om. Pre kreiranja tabele, potrebno je u specifikaciji tačno naglasiti koje će tipove podataka tabela sadržati.
Rešenje:
Tabela će sadržati polje ID, koje će, u odnosu na frekvenciju korisnika biti smallint, mediumint ili int.
Za polja ime i prezime, može se koristiti tip varchar(50), jer ni ime ni prezime neće prelaziti 50 karaktera. Za ova polja nikako ne treba koristiti tip text. Ovaj tip (varchar(50)) može se iskoristiti i za e-mail i broj telefona, dok za matični broj može biti iskorišćen tip varchar(13).
Konačni set podataka bi bio:
id int
ime varchar(50)
prezime varchar(50)
email varchar(50)
sifra varchar(50)
maticnibroj varchar(13)
Vežba 2
Problem:
Potrebno je kreirati tabelu automobil. Ova tabela sadržala bi podatke o kubikaži automobila, konjskim snagama, nazivu, maksimalnoj brzini i godini proizvodnje. Pre kreiranja tabele, potrebno je odrediti koji će tipovi podataka biti korišćeni.
Rešenje:
Kubikaža ne može biti veća od nekoliko hiljada, pa je smallint dovoljan tip. Broj konjskih snaga je još manji (ali ipak veći od tinyint-a), pa je i za njega dovoljan smallint. Maksimalna brzina takođe.
Za godinu proizvodnje možemo iskoristiti tip year, date, timestamp pa cak i smallint.
id int
kubikaza smallint
ks smallint
godinaproizvodnje year
Vežba 3
Problem:
Potrebno je kreirati tabelu za prodavnicu knjiga. Za svaku knjigu u tabeli, potrebo je čuvati naziv, cenu, autora, kratak opis, isbn broj i datum izdavanja.
Rešenje:
Naziv knjige može biti varchar(256), pod pretpostavkom da ne postoji naziv duži od 256 karaktera. Cena može biti tip decimal, sa šest cifara od čega dve decimale (pod pretpostavkom da ni jedna knjiga neće koštati više od 9999). Za kratak opis može se iskoristiti ili dugačak varchar (4000) ili text. Za datum izdavanja može se koristiti Timestamp
id int
naziv varchar(256)
cena decimal(6,2)
opis varchar(4000)
datumizdavanja Timestamp