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