8. diel - MySQL krok za krokom: Dátové typy a NULL
V predchádzajúcom cvičení, Riešené úlohy k 7. lekcii MySQL/MariaDB, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
Dnes sa vrátime k dátovým typom, predstavíme si tabuľky tých najdôležitejších a povieme si niečo o hodnote NULL.
Dátové typy
Hneď na začiatku seriálu sme si uviedli niekoľko základných dátových typov. Vtedy som vám s nimi nechcel motať hlavu. Reč bola o typoch INT, VARCHAR a DATE. Databáza (konkrétne tu MySQL) ich má samozrejme oveľa viac. Uveďme si pár tabuliek a predstavme si tie najdôležitejšie. Nasledujúce tabuľky zostavil redaktor Mircosoft a obsahujú tie najpoužívanejšie dátové typy.
Celé čísla
Typ | Rozsah |
---|---|
TINYINT | 8-bitové číslo |
SMALLINT | 16-bitové číslo |
MEDIUMINT | 24b číslo |
INT | 32b |
BIGINT | 64b |
Pozn. ak hľadáte dátový typ boolean (hodnoty true/false), tak na ukladanie tejto hodnoty sa spravidla používa TINYINT (0/1).
Texty
Typ | Rozsah |
---|---|
TINYTEXT | max. 255 B |
TEXT | max. 64 KB (to je naozaj dlhý text, napríklad článku) |
MEDIUMTEXT | max. 2 24 B |
LONGTEXT | max. 2 32 B |
VARCHAR (max. počet znakov) | počet znakov aký si zvolíte, max. 64 KB |
CHAR (počet znakov) | pevný počet znakov aký si zvolíte, max. 255 |
Ostatné
Typ | Rozsah |
---|---|
DATE | Dátum ako textový reťazec v tvare 'rrrr-mm-dd', rozsah od '1000-01-01' do '9999-12-31' |
TIME | Čas ako textový reťazec v tvare 'hh:mm:ss' |
DATETIME | Prakticky je to zreťazenie dátumu a času: 'rrrr-mm-dd hh:mm:ss' |
TIMESTAMP | Navonok sa chová rovnako ako Datetime, ale interne je to dword s počtom sekúnd uplynulých od 1.1.1970. Rozsah mu končí v januári 2038, takže tento typ veľmi neodporúčam a uvádzam ho len pre úplnosť. |
BLOB a spol. | Všeobecné dáta v binárnom tvare, použitie analogické k typom TEXT. Umožňujú do databázy ukladať napr. obrázky alebo zvuky. |
Dátové typy v databázach sa málinko odlišujú od dátových typov, ako ich poznáme v programovacích jazykoch. Zatiaľ čo napríklad v céčku môže mať int hodnoty len nejakých -32.000 až +32.000 a nič okrem toho, databázový INT môže nadobúdať aj hodnoty NULL. NULL nemá vôbec nič spoločné s nulou (0), označuje to, že hodnota nebola ešte zadaná. Filozofia databáz je takto postavená, nezadané hodnoty majú východiskovú hodnotu NULL (ak im nenastavíme inú) a každý dátový typ má okrem hodnôt, ktoré by sme v ňom očakávali, navyše možnú hodnotu NULL. Datovému typu túto hodnotu môžeme aj zakázať, viac ďalej.
Od verzie MySQL 5.7 je potrebné pri vkladaní nového riadku
buď uviesť hodnoty pre všetky stĺpce alebo aby tabuľka mala pre stĺpce,
pre ktoré hodnoty neuvádzame, nastavené východiskové hodnoty. V opačnom
prípade sa otázka skončí chybovou hláškou
#1364 - Field 'xxx' doesn't have a default value
. V starších
verziách pri vkladaní dát a neuvedení nejakého stĺpčeka MySQL automaticky
použila východiskovú hodnotu pre daný dátový typ. V prípade, že bol
stĺpček nullovateľný, použila NULL
, v opačnom prípade pre
string prázdny reťazec, pre číslo nulu a pod. Pretože sa stávalo, že
človek zabudol nejaký stĺpec uviesť a nebol na to upozornený, toto
správanie už ďalej neplatí.
Pokiaľ napr. príkazom INSERT vložíme užívateľa a vyplníme len niektoré hodnoty, do ďalších hodnôt sa vloží NULL. Skúsme si to:
INSERT INTO `uzivatele` (`jmeno`, `prijmeni`) VALUES ('Pan', 'Neuplny');
Výsledok:
Tabuľku používateľa sme vytvorili pomocou SQL dotazu CREATE
TABLE. Pokiaľ tabuľku naklikáme cez phpMyAdmin, zakáže nám v stĺpcoch
hodnotu NULL
a nenastavia východiskové hodnoty, museli by sme si
teda NULL
povoliť a nastaviť ho ako východiskovú hodnotu. Toto
je možné kedykoľvek zmeniť editáciou konkrétneho stĺpčeka v záložke
Štruktúra.
Prínos hodnoty NULL
Asi sa pýtate na čo hodnota NULL vlastne je? Jej prínos je v tom, že spoznáme, či bola hodnota zadaná. Napr. pri zadávaní čísla neexistuje hodnota, podľa ktorej by sme poznali, že číslo nie je zadané. Keby sme si k tomuto určili hodnotu nula (0), nevieme, či používateľ číslo nezadal alebo zadal práve nulu. NULL okrem iného aj šetrí miesto v databáze, kde na rozdiel od východiskových hodnôt nezaberá miesto.
NULL na strane aplikácie
Už sme si povedali o tom, že programovacie jazyky hodnotu NULL spravidla nemajú (teda tie staticky typované). V jazykoch ako napríklad dynamické PHP nemusíme dátový typ vôbec riešiť, aj keď je dobré vedieť, že sa na NULL môžeme opýtať, keď to budeme potrebovať. V jazykoch typovaných, ako je napríklad Java alebo C#, musíme použiť iné dátové typy. VC# môžeme ktorýkoľvek dátový typ označiť ako NULLovateľný a on pochopí, že v ňom môže byť aj NULL. V Jave budeme používať obaľovacie dátové typy s veľkými písmenami, teda napr. pre čísla namiesto int použijeme Integer.
Upresňujúce informácie k dátovým typom
K dátovým typom (ak chcete k stĺpcom) môžeme uviesť niekoľko upresňujúcich informácií. Už sme sa stretli s AUTO_INCREMENT. Pozrime sa na ďalšie.
Názov | Popis |
---|---|
AUTO_INCREMENT: | Len pre čísla. Pri vkladaní riadku dajte tejto položke hodnotu NULL a systém jej automaticky pridelí hodnotu o 1 väčšiu ako dal minulému riadku (prírastok sa teoreticky dá zmeniť, ale tým sa teraz nebudeme zaťažovať). Výborná vec na pohodlnú tvorbu unikátnych identifikačných kľúčov. |
UNIQUE | Hovorí, že nesmie existovať viac riadkov, ktoré majú v tejto položke rovnakú hodnotu (s výnimkou hodnoty NULL). Zmysel to má iba pri kľúčovách. |
NOT NULL | Táto hodnota nesmie byť prázdna - nepôjde do nej vložiť hodnota NULL. |
PRIMARY KEY | Tým sa určí, že sa tento stĺpec (v každej tabuľke max. jeden) bude používať ako kľúč. Vhodné pre nejaké relatívne krátke identifikačné kódy, podľa ktorých budeme riadky najčastejšie hľadať. Primárny kľúč je vždy NOT NULL a UNIQUE; aj keď to nenariadime, dostane tieto vlastnosti implicitne. |
DEFAULT hodnota | Predvolená hodnota, ktorú položka dostane, keď ju pri vkladaní riadka neuvedieme. Nefunguje na Texty, Bloby a položky s auto_incrementom. |
CREATE TABLE `uzivatele` ( uzivatele_id MEDIUMINT NOT NULL AUTO_INCREMENT, jmeno CHAR(35) NOT NULL, PRIMARY KEY (uzivatele_id) );
V nasledujúcom kvíze, Kvíz - Výber dát, radenie a dátové typy v MySQL, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.