IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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

V dnešním tutoriále si uvedieme niekoľko tabuliek dátových typov k databáze MySQL. Vysvetlíme si význam hodnoty NULL a niekoľko upresňujúcich informácií k typom.

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

Dátové typy pre celé čísla sú nasledujúce:

Typ Rozsah
TINYINT 8bitové číslo
SMALLINT 16bitové číslo
MEDIUMINT 24b číslo
INT 32b
BIGINT 64b

Keď za typom uvedieme upresňujúce slovo UNSIGNED, čísla budú bez znamienka (teda kladné), s rozsahom 0..2 počet bitov. Pokiaľ neuvedieme nič, čísla sú celé so znamienkom a rozsahom posunutým o polovicu do záporna (teda napr. miesto 0..255 bude -127..128).

Ak hľadáte dátový typ boolean (hodnoty true/false), tak na ukladanie tejto hodnoty sa spravidla používa TINYINT (0/1).

Texty

Dátové typy pre texty sú nasledujúce:

Typ Rozsah
TINYTEXT max. 255 B
TEXT max. 64 KB (to je naozaj dlhý text, napríklad článku)
MEDIUMTEXT max. 224 B
LONGTEXT max. 232 B
VARCHAR (max. number of characters) počet znakov aký si zvolíte, max. 64 KB
CHAR (number of characters) pevný počet znakov aký si zvolíte, max. 255

V ASCII textoch platia uvedené maximálne dĺžky priamo pre znaky (1 znak = 1 B). V kódovaní Unicode je potrebné počítať s tým, že jeden znak môže zabrať viac bytov.

Ostatné

Ostatné dátové typy sú:

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.

Hodnota NULL

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 príkaz 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 text 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 `users` (`first_name`, `last_name`) VALUES ('Sir', 'Incomplete');

Výsledok:

user_id first_name last_name birthdate article_count
31 John Johnson 1946-03-10 6
32 Sir Incomplete NULL NULL

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

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. V C# 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 value Predvolená hodnota, ktorú položka dostane, keď ju pri vkladaní riadka neuvedieme. Nefunguje pre texty, BLOB a položky s AUTO_INCREMENT.

Nové slová upresňujúce dátový typ sa vkladajú zaň, rovnako ako tomu bolo u AUTO_INCREMENT. Uveďme si nejaký príklad:

CREATE TABLE `users` (
    `user_id` MEDIUMINT NOT NULL AUTO_INCREMENT,
    `first_name` CHAR(35) NOT NULL,
    PRIMARY KEY (`user_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í.


 

Predchádzajúci článok
Riešené úlohy k 7. lekcii MySQL/MariaDB
Všetky články v sekcii
MySQL databázy krok za krokom
Preskočiť článok
(neodporúčame)
Kvíz - Výber dát, radenie a dátové typy v MySQL
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
8 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity