Elvi tudásunkhoz már csak egyetlen dolog hiányzik, mivel eddig nem beszéltünk a MySQL által használt adattípusokról. Az adatbázisunk tábláiban minden oszlopnak meg kell adnunk egy adattípust. Ez a definíció azt mondja meg, hogy az adott oszlopban miféle adatot tárolhatunk. A kiválasztott adattípus több kisebb-nagyobb következménnyel jár.
Numerikus adattípusok
A numerikus adattípusok számok tárolására alkalmasak.
- TINYINT
- -128 – 127 illetve 0 – 255
- SMALLINT
- -32.768 – 32.767 illetve 0 – 65 535
- MEDIUMINT
- -8.388.608 – 8.388.607 illetve 0 – 16.777.215
- INT, INTEGER
- -2.147.483.648 – 2.147.483.647 illetve 0 – 4.294.967.295
- BIGINT
- -9.223.372.036.854.775.808 – 9.223.372.036.854.775.807 illetve 0 – 18.446.744.073.709.551.615
- FLOAT(10,2)
- Előjeles lebegőpontos szám. Pontossága 24 tizedesjegyig mehet. A zárójelben megadott számok elhagyhatóak, a szám hosszát és a tizedesjegyek számát adják meg.
- DOUBLE(16,4), REAL
- Előjeles lebegőpontos szám. Pontossága 53 tizedes jegyig terjed.
- DECIMAL(10,0), NUMERIC
- Előjeles lebegőpontos szám 65 jegyig.
Az első öt típusnál az “illetve” azért került oda, mert ezek a típusok lehetnek előjelesek és előjel nélküliek is. A számok nem valami véletlenszám generátorból potyogtak ki, azért nem csinosabbak, mert a 2 hatványairól van szó.
Dátum és időtípusok
- DATE
- ÉÉÉÉ-HH-NN formában tárolt dátum. 9999. december 31-ig működőképes, utánna problémáink lesznek vele, szóval aki hosszú távra tervez az óvatosan használja! 🙂
- DATETIME
- ÉÉÉÉ-HH-NN ÓÓ:PP:MM formátumú időpont 9999. december 31 23 óra 59 perc 59 másodpercig.
- TIMESTAMP
- Az 1970. január 1 óta eltelt másodpercek száma.
- TIME
- ÓÓ:PP:MM formátumú időpont.
- YEAR
- 1901 – 2155 közötti év tárolására szolgál
Karakter típusok
- CHAR(1)
- Max 255 karakter tárolására szolgáló fix szélességű típus.
- VARCHAR(255)
- Max 255 karakter tárolására szolgáló változó szélességű típus.
- BLOB, TEXT
- 65.535 karakter tárolására alkalmas típus. Bináris adatokat BLOB-ként tárolhatunk.
- TINYBLOB, TINYTEXT
- 255 karakter tárolására szolgál.
- MEDIUMBLOB, MEDIUMTEXT
- 16.777.215 karakter
- LONGBLOB, LONGTEXT
- 4.294.967.295 karakter
- ENUM
- Max 65.535 féle előre meghatározott értéket tud tárolni. Rendezéseknél érdekes eredményeket adhat.
NULL
A NULL egy speciális adattípus. Egy számítógép számára nem egyértelmű egy olyan tény ami egy humanoid számára az. Például van egy listánk nevekkel és mellette, hogy az illető életben van-e vagy sem. Ha egy név mellett üres a él? mező, akkor egy számítógép azt fogja mondani, hogy emberünk nem is él és nem is halott, ami ugye nem valószínű. Ilyenkor egy NULL értékkel jelölhetjük, hogy az emberünknek van életbenléti jellemzője, csak éppen nem ismerjük.
A NULL értékek kezdetben meglehetősen zavarba ejtőek, táblák összekapcsolásánál időnként fura eredményeket okozhatnak, így az ismerkedési időszakban próbáljuk kerülni a használatát.
A gyakorlat
Kis példánkat szemügyre véve elég egyszerű dolgunk lesz. Azt kell minden esetben megvizsgálnunk, hogy milyen típusúés mekkora adatot fogunk tárolni. Kezdjük például a tantárgyak táblával. Az id-t az esetek döntő többségében numerikusan tároljuk. Nincs szükségünk előjelre, és ha nem akarunk több mint 255 féle tantárgyat nyilvántartani akkor egy előjel nélküli TINYINT típus megfelelő lesz.
A tantargy oszlopban szövegként tároljuk a tantárgy nevét. Pillanatnyilag úgy saccoljuk, hogy 45 karakter elegendő lesz.
Ha végiggondoljuk az összes szóban forgó oszlopot, akkor valami az alábbihoz hasonló eredményre fogunk jutni.
Kapcsolódó adatok típusa
A tantárgyak táblához kapcsolódó más táblákban is megjelenik a tantárgyak táblában található id mező. Sok kellemetlen meglepetéstől kímélhetjük meg magunkat ha ezeket azonos típusúnak választjuk mint a tantárgyak táblában lévő id mezőt. Szóval a osztaly_tantargy és a tanar_tantargy tablakban található tantargyak_id mezőknek is egy előjel nélküli TINYINT típust kell megadnunk.
Adattípusok módosítása
Előfordul, hogy a tervezés során rosszul saccoljuk meg a szükséges adattípus nagyságát. Azt azért többnyire el lehet találni, hogy numerikus vagy karakteres típust válasszunk, de a hosszot nem mindig lehet pontosan eltalálni. Ez akkor felettébb kellemetlen ha rövidebre vesszük a mező típusát a szükségesnél. Például ha mégis kiderül, hogy történetesen már berögzítettünk 255 féle tantárgyat és most be kellene rögzítenünk még egyet akkor egyszerűen ha fejenállva próbáljuk akkor sem fog sikerülni. Persze ez még egy egyszerűbb probléma, mivel egy SMALLINT-re való módosítás orvosolja a gondot.
Ha egy VARCHAR(45)-ként definiált oszlopba megpróbálunk egy 45 karakternél hosszabb stringet, akkor az szép csendben rögzítésre kerül, mégpedig úgy, hogy a 45-ik karaktertől kezdve a karakterek elrepülnek a semmibe. Nincs hibaüzenet, figyelmeztetés csak rögzítve ami belefér. Upsz, ezt jó nem elfelejteni.
Ha a szükségesnél nagyobbra vesszük a típus definíciót, mondjuk a tantargyat VARCHAR(255)-re, akkor a későbbiek során bármikor szűkebbre vehetjük a méretét.
Egyéb hossz tudnivalók
Az adat típusa többnyire azt is befolyásolja, hogy mekkora helyet foglal a tárolandó adat a merevlemezen. Az adattárak most már eléggé olcsóak ahhoz, hogy emiatt ne aggódjunk túlságosan, de azért érdemes figyelembe venni, hogy megéri-e üres adatoknak helyet foglalni a vinyón.
Másrészről a beállított adattípus befolyásolja, hogy a rendszer mekkora helyet foglal le a memóriában az adat fogadására. Egy VARCHAR(45)-ként definiált 3 karakter hosszú eltárolt string ugyan fele akkora helyet foglal a winchesteren mint egy 6 karakter hosszú string, de amikor megpróbáljuk kinyerni őket az adatbázisból a memóriában mindkettőjük számára egy 45 karakter fogadására alkalmas rész foglalódik le. Szóval a túldefiniálás némi memóriacsöpögéshez vezethet, ami pár százezres rekordszámnál számottevővé dagadhat.
A sorozat következő részében megismerkedünk pár egyszerű MySQL adminisztrációs alkalmazással, valamint a táblák létrehozására szolgáló SQL utasításokkal.
Nagyon szupi a sorozat, gratula!
Nagyszerűen ábrázoltad a megvalósítandó ‘feladatot’, viszont megcsinálni már nem kis csapás, pedig alapjáraton egy piti problémát feszetegettél. Nem tudom, így második körben lehet egy picit elriasztottál ? 🙂
A leíráshoz egy apró észrevétel:
TIMESTAMP értéknél: http://hu.wikipedia.org/wiki/Unix_epoch
Nagy valószínűséggel Epoc kolléga erre utalt.
TIMESTAMP értéknél egy 0-val benézted:
http://hu.wikipedia.org/wiki/Unix_epoch
Cókolom bácsi: Kösz, javítva.
Jó kis leírás, csak egy észrevételem lenne:
A karakterláncok méretének meghatározásánál nem árt, ha a hossz osztható 4-el, de leginkább 8-al (a szerver valószínűleg 64 bites), mert a memóriablokkok másolása mindig maximális szószélességgel (32 bit: 4 byte, 64 bit: 8 byte) történik, vagyis gyorsabb, ha nem kell a végén a “maradékot” totojgatnia. Ez itt a gyakorlatban a 45 karakter helyett 44-et, (32 bit), vagy 48-at (64 bit) jelent.
Helló! Igaz nem mi leírás, viszont faja. Egy kérdés, ha jól értelmeztem, pl egy INT(5) típusnál maximum 5 számjegyből azaz maximum 99999 lehet az értéke?