6. díl - MySQL krok za krokem: Datové typy a NULL

MySQL MySQL krok za krokem: Datové typy a NULL

V minulém dílu seriálu tutoriálů o MySQL databázi jsme se dozvěděli něco o řazení a o agregačních funkcích. 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 přirozená), 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.

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:

Vložení uživatele s nezadanými hodnotami do MySQL databáze

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, kterou bychom si museli povolit.

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 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)
);

Příště si připravíme tabulky a testovací data pro jednoduchý redakční systém, jako je třeba tady na devbooku. Další díly totiž budeme dělat dotazy přes více tabulek a tzv. poddotazy. Tak bude váš arzenál základních databázových nástrojů kompletní pro tvorbu prakticky jakékoli aplikace :)


 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (9 hlasů) :
55555


 



 

 

Komentáře
Zobrazit starší komentáře (3)

Avatar
Jiří Gracík
Redaktor
Avatar
Odpovědět 26.1.2014 17:59
Creating websites is awesome till you see the result in another browser ...
Avatar
00
Člen
Avatar
Odpovídá na Jiří Gracík
00:

Děkuji. Jak mám zapisovat hodnotu?

// Jde použít např. 133.99 ?

Editováno 26.1.2014 18:05
 
Odpovědět 26.1.2014 18:03
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na 00
Jiří Gracík:

Decimal má pevně nastavenou desetinou čárku i délku. Takže při vytvoření tabulky mu je musíš nastavit

CREATE TABLE `price` (
...,
`price` decimal(11,2) NOT NULL,
...
)

V tomo případě by bylo číslo 11 cifer dlouhé včetně dvou cifer za desetinnou čárkou (maximálně tam tedy nacpeš 999999999.99). Záznam pak vkládáš přesně tak, jak jsi psal ;)

Editováno 26.1.2014 18:21
Odpovědět 26.1.2014 18:19
Creating websites is awesome till you see the result in another browser ...
Avatar
00
Člen
Avatar
Odpovídá na Jiří Gracík
00:

Já s MySql moc zkušenstí nemám, ale občas ho používám. Právě tohle jsem potřeboval vědět.

 
Odpovědět 26.1.2014 18:24
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na 00
Jiří Gracík:

Tak to jsme na tom podobně - chce to víc hledat.

Editováno 26.1.2014 18:31
Odpovědět 26.1.2014 18:31
Creating websites is awesome till you see the result in another browser ...
Avatar
michal.smatlak:

Zdravím, možno bude moja otázka znieť blbo, ale ako pri vytváraní nového políčka napr: obrazky dám naň defaultne NULL?
Za všetky rady vopred Ďakujem.

 
Odpovědět 18. března 21:29
Avatar
Robert
Člen
Avatar
Robert:

Ak zadám príkaz na doplnenie hodnoty do tabuľky, aj napriek tomu, že hodnotu zadám v desatinom tvare ju uloží ako celé číslo. Datový týp mám nastavený ako decimal.

Neviete poradiť?

 
Odpovědět 7. listopadu 18:48
Avatar
Odpovídá na Robert
Michal Štěpánek:

Zkusil jsi místo desetinné tečky použít čárku?

Odpovědět 7. listopadu 22:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Robert
Dominik Gavrecký:

Aký dátoví typ máš na spotreba1 ?

Odpovědět 8. listopadu 8:16
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Robert
Člen
Avatar
 
Odpovědět 8. listopadu 20:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 13. Zobrazit vše