sql >> Databáze >  >> RDS >> Mysql

Úvod do datových typů MySQL


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




  1. Nastavení Oracle na výchozí schéma uživatele (beze změny relace)

  2. předat celočíselné pole do procedury Oracle pomocí c#

  3. zastavení při chybě kompilace ve skriptu sqlplus

  4. DATEDIFF() vs DATEDIFF_BIG() v SQL Server:Jaký je rozdíl?