MySQL mindenkinek 2

MySQLElvi 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.

7 thoughts on “MySQL mindenkinek 2

  1. 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 ? 🙂

  2. 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.

  3. 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?

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.