Lekce 8 - MySQL krok za krokem: Datové typy a NULL
V předešlém cvičení, Řešené úlohy k 7. lekci MySQL/MariaDB, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Dnes se vrátíme k datovým typům, představíme si tabulky těch nejdůležitějších a řekneme si něco o hodnotě NULL.
Datové typy
Hned na začátku seriálu jsme si uvedli několik základních datových typů. Tehdy jsem vám s nimi nechtěl motat hlavu. Řeč byla o typech INT, VARCHAR a DATE. Databáze (konkrétně zde MySQL) jich má samozřejmě mnohem více. Uveďme si pár tabulek a představme si ty nejdůležitější. Následující tabulky sestavil redaktor Mircosoft a obsahují ty nejpoužívanější datové typy.
Celá čísla
Typ | Rozsah |
---|---|
TINYINT | 8bitové číslo |
SMALLINT | 16bitové číslo |
MEDIUMINT | 24b číslo |
INT | 32b |
BIGINT | 64b |
Když za typem uvedeme upřesňující slovo UNSIGNED, čísla budou bez znaménka (tedy kladná), s rozsahem 0..2počet bitů. Pokud neuvedeme nic, čísla jsou celá se znaménkem a rozsahem posunutým o polovinu do záporna (tedy např. místo 0..255 bude -127..128).
Pozn. pokud hledáte datový typ boolean (hodnoty true/false), tak k ukládání této hodnoty se zpravidla používá TINYINT (0/1).
Texty
Typ | Rozsah |
---|---|
TINYTEXT | max. 255 B |
TEXT | max. 64 KB (to je opravdu dlouhý text, třeba článku) |
MEDIUMTEXT | max. 224 B |
LONGTEXT | max. 232 B |
VARCHAR (max. počet znaků) | počet znaků jaký si zvolíte, max. 64 KB |
CHAR (počet znaků) | pevný počet znaků jaký si zvolíte, max. 255 |
V ASCII textech platí uvedené maximální délky přímo pro znaky (1 znak = 1 B). V kódování Unicode je potřeba počítat s tím, že jeden znak může zabrat víc bytů.
Ostatní
Typ | Rozsah |
---|---|
DATE | Datum jako textový řetězec ve tvaru 'rrrr-mm-dd', rozsah od '1000-01-01' do '9999-12-31' |
TIME | Čas jako textový řetězec ve tvaru 'hh:mm:ss' |
DATETIME | Prakticky je to zřetězení data a času: 'rrrr-mm-dd hh:mm:ss' |
TIMESTAMP | Navenek se chová stejně jako Datetime, ale interně je to dword s počtem sekund uplynulých od 1.1.1970. Rozsah mu končí v lednu 2038, takže tenhle typ moc nedoporučuji a uvádím ho jenom pro úplnost. |
BLOB a spol. | Obecná data v binárním tvaru, použití analogické k typům TEXT. Umožňují do databáze ukládat např. obrázky nebo zvuky. |
Hodnota NULL
Datové typy v databázích se malinko odlišují od datových typů, jak je známe v programovacích jazycích. Zatímco třeba v céčku může mít int hodnoty jen nějakých -32.000 až +32.000 a nic kromě toho, databázový INT může nabývat i hodnoty NULL. NULL nemá vůbec nic společného s nulou (0), označuje to, že hodnota nebyla ještě zadána. Filozofie databází je takto postavena, nezadané hodnoty mají výchozí hodnotu NULL (pokud jim nenastavíme jinou) a každý datový typ má kromě hodnot, které bychom v něm očekávali, navíc možnou hodnotu NULL. Datovému typu tuto hodnotu můžeme i zakázat, více dále.
Od verze MySQL 5.7 je třeba při vkládání nového řádku
buď uvést hodnoty pro všechny sloupce nebo aby tabulka měla pro sloupce, pro
které hodnoty neuvádíme, nastavené výchozí hodnoty. V opačném případě
dotaz skončí chybovou hláškou
#1364 - Field 'xxx' doesn't have a default value
. Ve starších
verzích při vkládání dat a neuvedení nějakého sloupečku MySQL
automaticky použila výchozí hodnotu pro daný datový typ. V případě, že
byl sloupeček nullovatelný, použila NULL
, v opačném případě
pro string prázdný řetězec, pro číslo nulu apod. Protože se stávalo, že
člověk zapomněl nějaký sloupec uvést a nebyl na to upozorněn, toto
chování již dále neplatí.
Pokud např. příkazem INSERT vložíme uživatele a vyplníme jen některé hodnoty, do dalších hodnot se vloží NULL. Zkusme si to:
INSERT INTO `uzivatele` (`jmeno`, `prijmeni`) VALUES ('Pan', 'Neuplny');
Výsledek:

Tabulku uzivatele jsme vytvořili pomocí SQL dotazu CREATE
TABLE. Pokud tabulku naklikáme přes phpMyAdmin, zakáže nám ve sloupcích
hodnotu NULL
a nenastaví výchozí hodnoty, museli bychom si tedy
NULL
povolit a nastavit jej jako výchozí hodnotu. Toto lze
kdykoliv změnit editací konkrétního sloupečku v záložce Struktura.
Přínos hodnoty NULL
Asi se ptáte k čemu hodnota NULL vlastně je? Její přínos je v tom, že poznáme, jestli byla hodnota zadána. Např. při zadávání čísla neexistuje hodnota, podle které bychom poznali, že číslo není zadáno. Kdybychom si k tomuto určili hodnotu nula (0), nevíme, jestli uživatel číslo nezadal nebo zadal právě nulu. NULL mimo jiné i šetří místo v databázi, kde narozdíl od výchozích hodnot nezabírá místo.
NULL na straně aplikace
Již jsme si řekli o tom, že programovací jazyky hodnotu NULL zpravidla nemají (tedy ty staticky typované). V jazycích jako je třeba dynamické PHP nemusíme datový typ vůbec řešit, i když je dobré vědět, že se na NULL můžeme zeptat, když to budeme potřebovat. V jazycích typovaných, jako je třeba Java nebo C#, musíme použít jiné datové typy. V C# můžeme kterýkoli datový typ označit jako NULLovatelný a on pochopí, že v něm může být i NULL. V Javě budeme používat obalovací datové typy s velkými písmeny, tedy např. pro čísla místo int použijeme Integer.
Upřesňující informace k datovým typům
K datovým typům (chcete-li ke sloupcům) můžeme uvést několik upřesňujících informací. Již jsme se setkali s AUTO_INCREMENT. Podívejme se na další.
Název | Popis |
---|---|
AUTO_INCREMENT: | Jen pro čísla. Při vkládání řádku dejte této položce hodnotu NULL a systém jí automaticky přidělí hodnotu o 1 větší než dal minulému řádku (přírůstek se teoreticky dá změnit, ale tím se teď nebudeme zatěžovat). Výborná věc pro pohodlnou tvorbu unikátních identifikačních klíčů. |
UNIQUE | Říká, že nesmí existovat víc řádků, které mají v této položce stejnou hodnotu (s výjimkou hodnoty NULL). Smysl to má pouze u klíčů. |
NOT NULL | Tahle hodnota nesmí být prázdná - nepůjde do ní vložit hodnota NULL. |
PRIMARY KEY | Tím se určí, že se tenhle sloupec (v každé tabulce max. jeden) bude používat jako klíč. Vhodné pro nějaké relativně krátké identifikační kódy, podle kterých budeme řádky nejčastěji hledat. Primární klíč je vždy NOT NULL a UNIQUE; i když to nenařídíme, dostane tyhle vlastnosti implicitně. |
DEFAULT hodnota | Výchozí hodnota, kterou položka dostane, když ji při vkládání řádku neuvedeme. Nefunguje na Texty, Bloby a položky s auto_incrementem. |
Nová slova upřesňující datový typ se vkládají za něj, stejně jako tomu bylo u AUTO_INCREMENT. Uveďme si nějaký příklad:
CREATE TABLE `uzivatele` ( uzivatele_id MEDIUMINT NOT NULL AUTO_INCREMENT, jmeno CHAR(35) NOT NULL, PRIMARY KEY (uzivatele_id) );
V následujícím kvízu, Kvíz - Výběr dat, řazení a datové typy v MySQL, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.