Úvod
Jednou z primárních vlastností relačních databází obecně je schopnost definovat schémata nebo struktury tabulek, které přesně specifikují formát dat, která budou obsahovat. To se provádí předepsáním sloupců, které tyto struktury obsahují, spolu s jejich datovým typem a jakákoli omezení.
Datové typy určují obecný vzor pro data, která přijímají a ukládají. Aby byly hodnoty akceptovány MySQL, musí splňovat požadavky, které nastiňují. I když je možné definovat vlastní požadavky, datové typy poskytují základní stavební bloky, které umožňují MySQL ověřovat vstup a pracovat s daty pomocí vhodných operací.
MySQL obsahuje širokou škálu datových typů, které se používají k označení a ověření, že hodnoty odpovídají příslušným typům. V této příručce probereme nejběžnější datové typy dostupné v MySQL, různé vstupní a výstupní formáty, které používají, a jak nakonfigurovat různá pole, aby vyhovovala potřebám vašich aplikací.
Jaké jsou datové typy v MySQL?
Než půjdeme do podrobností, podívejme se na to, jaké datové typy MySQL poskytuje.
MySQL podporuje rozumnou škálu datových typů vhodných pro různé typy jednoduchých i složitých dat. Patří mezi ně:
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
DECIMAL
NUMERIC
FLOAT
DOUBLE
BIT
DATE
DATETIME
TIMESTAMP
TIME
YEAR
CHAR
VARCHAR
BINARY
VARBINARY
BLOB
TEXT
ENUM
SET
GEOMETRY
POINT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
JSON
Nejběžnějšími z nich se budeme podrobněji zabývat v této příručce.
Začínáme s datovými typy MySQL
Když začínáte s typy, je důležité si uvědomit, že samotné typy nejsou vždy úplným řešením ověřování dat, ale součástí. Další databázové nástroje, jako jsou omezení, také hrají roli při definování správnosti. Přesto jsou datové typy často první linií obrany proti neplatným datům.
V mnoha případech jsou obecné typy poskytované MySQL vhodné pro druhy dat, která budete ukládat. Zatímco například můžete uložit souřadnice geometrického bodu do dvou různých číselných sloupců, poskytnutý point
typ je určen k ukládání a ověřování přesně tohoto typu informací. Při výběru typů zkontrolujte, zda používáte nejkonkrétnější typ vhodný pro váš případ použití.
Čísla a číselné hodnoty
MySQL obsahuje řadu numerických datových typů vhodných pro různé scénáře. Vhodný typ závisí na přesné povaze hodnot, které plánujete uložit, a také na vašich požadavcích na přesnost.
Celá čísla
celé číslo datový typ je kategorie typů používaných k ukládání čísel bez zlomků nebo desetinných míst. Mohou to být kladné nebo záporné hodnoty a různé typy celých čísel mohou ukládat různé rozsahy čísel. Celočíselné typy s menšími rozsahy přijatelných hodnot zabírají méně místa než typy s širšími rozsahy.
Základní seznam celočíselných typů zahrnuje následující:
Typ celého čísla | Délka | Použitelný rozsah se znaménkem | Použitelný nepodepsaný rozsah |
---|---|---|---|
TINYINT | 1 bajt | -128 až 127 | 0 až 255 |
SMALLINT | 2 bajty | -32768 až 32767 | 0 až 65535 |
MEDIUMINT | 3 bajty | -8388608 až 8388607 | 0 až 16777215 |
INT | 4 bajty | -2147483648 až 2147483647 | 0 až 4294967295 |
BIGINT | 8 bajtů | -2^63 až -2^63-1 | 0 až 2^64-1 |
Výše uvedené typy jsou omezeny svým platným rozsahem. Jakákoli hodnota mimo rozsah bude mít za následek chybu.
Kromě výše uvedených typů rozpozná MySQL také alias nazvaný SERIAL
. Označení sloupce jako SERIAL
dá mu tyto vlastnosti:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. To se používá jako zkratka pro běžné vlastnosti sloupce primárního klíče. Sloupec automaticky přiřadí novou jedinečnou hodnotu při každém přidání záznamu.
Pevný bod
Typy s pevným bodem se používají k ovládání množství přesnosti nebo specifičnost možná pro číslo s desetinnými místy. V MySQL to lze ovládat manipulací se dvěma faktory:přesností a měřítkem.
Přesnost je maximální celkový počet číslic, které může mít číslo. Naproti tomu škálování je počet číslic napravo od desetinné čárky. Manipulací s těmito čísly můžete ovládat, jak velké mohou být zlomkové a nezlomkové složky čísla.
Tyto dva argumenty se používají k ovládání libovolné přesnosti pomocí numeric
nebo decimal
datové typy (tyto dva typy jsou v MySQL synonymy). numeric
type má nula až dva argumenty.
Bez argumentů je sloupec definován jako s přesností 10 a stupnicí 0. To znamená, že sloupec může obsahovat až 10 číslic, ale žádná z nich nesmí být za desetinnou čárkou:
NUMERIC
Pokud je zadán jeden argument, je interpretován jako přesnost sloupce s měřítkem nastaveným na 0. To vám efektivně umožňuje zadat maximální počet číslic v čísle podobném celému číslu (žádné zlomkové nebo desetinné složky). Pokud například potřebujete 5místné celé číslo, můžete zadat:
NUMERIC(5)
Při konfiguraci sloupce pomocí obou ovládacích prvků zadejte přesnost následovanou měřítkem. MySQL zaokrouhlí desetinnou složku jakéhokoli vstupu na správný počet číslic pomocí čísla stupnice. MySQL použije přesnost a měřítko k určení, kolik číslic je povoleno na levé straně desetinné čárky. Pokud záznam překročí povolený počet číslic, MySQL vyvolá chybu.
Můžeme například zadat sloupec s celkovou přesností 5 a měřítkem 2:
NUMERIC(5, 2)
Tento sloupec by měl následující chování:
Vstupní hodnota | Zaokrouhlená hodnota | Přijato (odpovídá přesnosti)? |
---|---|---|
400,28080 | 400,28 | Ano |
8,332799 | 8.33 | Ano |
11799,799 | 11799,80 | Ne |
11799 | 11799 | Ne |
2802,27 | 2802,27 | Ne |
Plovoucí desetinná čárka
Čísla s plovoucí desetinnou čárkou jsou dalším způsobem vyjádření desetinných čísel, ale bez přesné a konzistentní přesnosti. Místo toho mají typy s pohyblivou řádovou čárkou pouze koncept maximální přesnosti, která často souvisí s architekturou a platformou hardwaru.
Chcete-li například omezit sloupec s plovoucí desetinnou čárkou na 8 číslic s přesností, můžete použít FLOAT
typ, který ukládá výsledky pomocí 4 bajtů s přesností od 0 do 23 číslic:
FLOAT(8)
Podobně DOUBLE
typ používá k ukládání dat 8 bajtů a může používat přesnost 24 až 53 číslic.
Díky těmto možnostem návrhu mohou čísla s plovoucí desetinnou čárkou pracovat s čísly s velkým počtem desetinných míst efektivně, ale ne vždy přesně. Vnitřní reprezentace čísel může způsobit drobné rozdíly mezi vstupem a výstupem. To může způsobit neočekávané chování při porovnávání hodnot, provádění matematiky s pohyblivou řádovou čárkou nebo provádění operací, které vyžadují přesné hodnoty.
plovoucí desetinná čárka vs. numerická
Obě čísla s pohyblivou řádovou čárkou poskytují typy jako FLOAT
a DOUBLE
a čísla pevných bodů poskytovaná NUMERIC
nebo DECIMAL
typy lze použít k uložení desetinných hodnot. Jak víte, který z nich použít?
Obecným pravidlem je, že pokud potřebujete ve výpočtech přesnost, NUMERIC
typ je vždy lepší volba. NUMERIC
type bude ukládat hodnoty přesně tak, jak jsou poskytovány, což znamená, že výsledky jsou zcela předvídatelné při načítání nebo přepočítávání hodnot. NUMERIC
typ se nazývá libovolná přesnost, protože zadáte míru přesnosti, kterou typ vyžaduje, a v poli bude uložen přesný počet číslic.
Naproti tomu typy jako FLOAT
a DOUBLE
jsou typy s proměnlivou přesností. Míra přesnosti, kterou zachovávají, závisí na vstupní hodnotě. Když dosáhnou konce povolené úrovně přesnosti, mohou zaokrouhlit zbývající číslice, což vede k rozdílům mezi odeslanými a načtenými hodnotami.
Kdy byste tedy použili typy s proměnnou přesností? Typy proměnných přesností, jako je FLOAT
a DOUBLE
jsou vhodné pro scénáře, kde nejsou nutné přesné hodnoty (například pokud budou stejně zaokrouhleny) a kdy je rychlost vysoce cenná. Proměnná přesnost obecně nabízí výhody výkonu oproti NUMERIC
typ.
Typy řetězců
Typy znaků a řetězců MySQL lze rozdělit do dvou kategorií:pevná délka a proměnná délka . Volba mezi těmito dvěma ovlivňuje, jak MySQL přiděluje prostor pro každou hodnotu a jak ověřuje vstup.
Nejjednodušší znakový datový typ v MySQL je char
typ. Bez argumentů, char
typ přijímá jeden znak jako vstup:
CHAR
Pokud je v deklaraci uvedeno kladné celé číslo, char
sloupec bude ukládat řetězec znaků s pevnou délkou rovnající se počtu zadaných znaků:
CHAR(10)
Je-li řetězec zadán s méně znaky, přidají se k vyplnění délky mezery:
Vstup | Uložená hodnota | ||
---|---|---|---|
'strom' | 4 | 'strom ' | 10 |
Pokud je zadán řetězec s větším než povoleným počtem znaků, MySQL vyvolá chybu. Výjimkou z tohoto pravidla je, že pokud jsou přebytečné znaky všechny mezery, MySQL nadbytečné mezery jednoduše zkrátí, aby se vešly do pole.
Alternativou k polím znaků s pevnou délkou jsou pole s proměnnou délkou. K tomu poskytuje MySQL varchar
typ. varchar
typ ukládá znaky bez pevné velikosti. Na rozdíl od char
, varchar
nelze použít bez určení maximálního počtu znaků k uložení.
Definováním varchar
s kladným celým číslem můžete nastavit maximální délku řetězce:
VARCHAR(10)
To se liší od použití char
zadejte s celým číslem v tomto varchar
nevyplní hodnotu, pokud vstup nesplňuje maximální délku pole:
Vstup | Uložená hodnota | ||
---|---|---|---|
'strom' | 4 | 'strom' | 4 |
Pokud je řetězec větší než maximální délka, MySQL vyvolá chybu. Stejné zkrácení chování, jaké je přítomno v char
pole se vyskytuje zde:pokud jsou přetékající znaky mezery, budou zkráceny, aby se vešly do maximální délky znaků.
MySQL také podporuje binary
a varbinary
typy dat. Ty fungují podobným způsobem jako char
a varchar
typy, ale ukládají spíše binární řetězce než znakové řetězce. To má dopad na to, jak jsou uloženy a provozovány (pro věci jako porovnávání, třídění atd.).
Pro binary
a varbinary
typů, celé číslo uvedené při definování typu sloupce představuje počet bajtů místo počtu znaků.
Dva další datové typy, které MySQL poskytuje pro ukládání řetězců a znaků, jsou blob
a text
. Tyto typy fungují podobně jako varchar
a varbinary
typů a jsou určeny pro skladování velkých předmětů. Fungují většinou stejně jako jejich protějšky, ale mají několik rozdílů, například nemohou mít výchozí hodnoty a vyžadují při vytváření indexu délku předpony.
Booleovské hodnoty
MySQL ve skutečnosti nemá nativní booleovský typ, který by reprezentoval hodnoty true a false.
MySQL rozpoznává typy BOOL
nebo BOOLEAN
ve snaze o kompatibilitu s jinými databázovými systémy. Jeho vnitřní implementace však používá TINYINT(1)
ukládat hodnoty a interpretovat je jako pravdivé nebo nepravdivé na základě sady pravidel.
Při interpretaci číselných hodnot v booleovském kontextu hodnota 0
je považováno za nepravdivé. Všechny nenulové hodnoty jsou považovány za pravdivé.
MySQL rozpoznává booleovské literály TRUE
a FALSE
a převede TRUE
na 1 a FALSE
na 0 při jejich ukládání.
Data a čas
MySQL podporuje reprezentaci dat, časů a kombinací těchto dvou.
Data
date
type může uložit datum bez přiřazené časové hodnoty:
DATE
Při zpracování vstupu pro date
sloupců, může MySQL interpretovat různé formáty a určit správné datum uložení. Součásti však musí vždy přijít ve stejném pořadí:rok, měsíc a poté den. STR_TO_DATE()
je k dispozici funkce, která pomáhá převést jiné formáty data do formátu, který bude MySQL interpretovat správně.
Při zobrazování dat používá MySQL YYYY-MM-DD
formát. Můžete použít DATE_FORMAT()
funkci formátovat výstup v jiných formátech.
date
typ může ukládat hodnoty v rozsahu 1000-01-01
na 9999-12-31
.
Čas
time
datový typ může ukládat konkrétní čas dne bez přiřazeného časového pásma nebo data.
Při zpracování vstupu pro time
sloupců, může MySQL interpretovat více formátů a určit správný čas uložení. Pokud má vstup dvojtečky, je obecně interpretován jako hh:mm:ss
. Jakákoli zkrácená hodnota (pomocí pouze jednoho sloupce) bude interpretována jako hh:mm
. Když vstup není mají dvojtečky, je čas zpracován tak, aby se nejdříve naplnila nejmenší hodnota. Například 1045
je bráno jako 10 minut a 45 sekund.
MySQL také podporuje zlomky sekund, pokud je uvedena desetinná čárka. Za desetinnou čárkou ukládá až 6 číslic s přesností. Hodnoty v time
počet sloupců může být v rozsahu -838:59:59.000000
na 838:59:59.000000
.
Při zobrazování časových hodnot používá MySQL hh:mm:ss
formát. Stejně jako u dat je k dispozici funkce nazvaná TIME_FORMAT()
k zobrazení časových hodnot pomocí jiných formátů.
Časová razítka a datum a čas
MySQL může představovat časová razítka, kombinaci data a času používaného k reprezentaci konkrétního okamžiku v čase, ve dvou různých variantách:pomocí timestamp
typ a datetime
typ.
datetime
typ může představovat hodnoty od 1000-01-01 00:00:00
na 9999-12-31 23:59:59
. Může také obsahovat zlomkové sekundy o délce až šesti číslic podobně jako time
typ.
timestamp
typ může představovat hodnoty z 1970-01-01 00:00:01
UTC do 2038-01-19 03:14:07
UTC. Zvládne i zlomky sekund. Při ukládání timestamp
hodnoty, jsou všechny hodnoty převedeny z daného časového pásma na UTC pro uložení a při načtení převedeny zpět do místního časového pásma. datetime
typ to nedělá.
Od MySQL 8.0.19 a novější můžete při ukládání timestamp
zahrnout posun časového pásma explicitně nastavit časové pásmo pro uloženou hodnotu. Toho dosáhnete vložením hodnoty za časovou složku bez mezery pro označení posunu. Rozsah akceptovaných hodnot je od -14:00
do +14:00
, který představuje posun uložené hodnoty od UTC.
Při rozhodování, zda uložit hodnoty data a času pomocí datetime
nebo timezone
typů, je často užitečné je oddělit podle toho, k čemu jsou nejlepší.
Myslete na datetime
hodnoty jako konkrétní datum a čas ve vztahu ke kalendáři a hodinám, ať jsou načteny kdekoli. Pokud osoba jde spát v 23 hodin večer, datetime
hodnota může představovat tuto hodnotu bez ohledu na to, v jakém časovém pásmu se daný člověk aktuálně nachází.
Na druhou stranu timezone
hodnoty nejlépe představují konkrétní okamžik v čase, který je jednoznačný napříč časovými pásmy. Chcete-li odeslat pozvánku na videohovor, timezone
hodnota by dokázala zajistit, že schůzka proběhne ve stejnou dobu pro všechny, bez ohledu na to, v jakém časovém pásmu se účastník nachází.
Další užitečné typy
Kromě typů, které jsme do určité hloubky popsali výše, existují další typy, které jsou užitečné ve specifických scénářích. Krátce je probereme, abyste měli představu, jak je používat a kdy mohou být užitečné.
Vyjmenované a nastavené typy
Dva související typy, které uživatelům umožňují diktovat platné hodnoty pro sloupec, jsou enum
a set
typy.
enum
typ je typ řetězce, který umožňuje uživateli definovat kolekci platných hodnot při vytvoření sloupce. Jakákoli hodnota, která odpovídá jedné z definovaných hodnot, je přijata a všechny ostatní hodnoty jsou odmítnuty. Funguje podobně jako rozbalovací nabídka v tom, že lze provést výběr ze specifické sady možností. Například enum
s názvem season
lze vytvořit s hodnotami winter
, spring
, summer
a autumn
.
Chcete-li vytvořit enum
zadejte typ jako enum
, přičemž možné hodnoty uvedete jako řetězce oddělené čárkami uvnitř sady závorek, jako je tento:
season ENUM('winter', 'spring', 'summer', 'autumn')
Podobným typem uživatelem definovaného typu je set
typ. Stejně jako enum
zadejte, set
typy umožňují uživatelům zadat platné hodnoty jako řetězce při definici. Rozdíl mezi těmito dvěma typy je v set
, pro každý záznam lze uložit více než jednu hodnotu.
Pokud jste například potřebovali sloupec reprezentující dny v týdnu, kdy jsou dobrovolníci k dispozici pro práci, můžete mít set
sloupec takto:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
Při zadávání hodnot pro availability
sloupec, který jsme právě vytvořili, zadáte jeden řetězec s čárkami oddělujícími všechny dny, kdy je dobrovolník k dispozici. Například:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
Pro set
typů v MySQL, duplicitní hodnoty ve vstupu jsou vždy odstraněny a po načtení se hodnoty řídí pořadím použitým v set
definice bez ohledu na pořadí při zadání do sloupce.
JSON
MySQL podporuje sloupce v JSON pomocí json
typ. Data uložena jako json
je uložen v binárním formátu pro rychlejší provádění a zpracování, takže server nemusí interpretovat řetězec, aby fungoval na JSON
hodnoty.
JSON
Pro provoz na JSON
sloupců, MySQL poskytuje řadu funkcí pro práci s hodnotami v dokumentu.
Závěr
V tomto článku jsme probrali spoustu nejběžnějších datových typů, které jsou užitečné při práci s databázemi MySQL. Existují další typy, které nejsou uvedeny v této příručce, o kterých je užitečné vědět, ale představují dobrý výchozí bod pro většinu případů použití.
Je důležité správně používat typový systém, abyste mohli kontrolovat platné hodnoty a pracovat s daty podle očekávání. Existují úskalí, na která můžete narazit, pokud zvolíte typ, který se pro vaše data nehodí, takže ve většině případů stojí za to si to rozmyslet, než se zavážete k datovému typu.
Pokud pro práci s databázemi MySQL používáte klienta Prisma, můžete najít mapování mezi některými běžnými typy MySQL a Prisma v dokumentech datových konektorů MySQL společnosti Prisma.