sql >> Databasteknik >  >> RDS >> Mysql

En introduktion till MySQL-datatyper


Introduktion

En av de primära egenskaperna hos relationsdatabaser i allmänhet är förmågan att definiera scheman eller tabellstrukturer som exakt anger formatet på de data som de kommer att innehålla. Detta görs genom att föreskriva kolumnerna som dessa strukturer innehåller tillsammans med deras datatyp och eventuella begränsningar.

Datatyper anger ett allmänt mönster för den data de accepterar och lagrar. Värden måste följa de krav som de beskriver för att accepteras av MySQL. Även om det är möjligt att definiera anpassade krav, tillhandahåller datatyper de grundläggande byggstenarna som gör att MySQL kan validera indata och arbeta med data med hjälp av lämpliga operationer.

MySQL innehåller ett brett utbud av datatyper som används för att märka och validera att värden överensstämmer med lämpliga typer. I den här guiden kommer vi att diskutera de vanligaste datatyperna som finns tillgängliga i MySQL, de olika in- och utdataformat de använder och hur man konfigurerar olika fält för att möta dina applikationers behov.


Vilka är datatyperna i MySQL?

Innan vi går in i detalj, låt oss ta en bred bild av vilka datatyper MySQL tillhandahåller.

MySQL stöder ett rimligt utbud av datatyper som lämpar sig för olika typer av enkla och komplexa data. Dessa inkluderar:

  • 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

Vi kommer att täcka de vanligaste av dessa mer ingående i den här guiden.



Komma igång med MySQL-datatyper

När du kommer igång med typer är det viktigt att komma ihåg att typer ensamma inte alltid är en komplett lösning för datavalidering, utan en komponent. Andra databasverktyg, som begränsningar, har också en roll att spela för att definiera korrekthet. Ändå är datatyper ofta den första försvarslinjen mot ogiltiga data.

I många fall är de allmänna typerna som tillhandahålls av MySQL lämpliga för den typ av data du kommer att lagra. Du kan till exempel lagra koordinaterna för en geometrisk punkt i två olika talkolumner, men den angivna point typen är specialbyggd för att lagra och validera exakt denna typ av information. När du väljer typer, kontrollera att du använder den mest specifika typen som gäller för ditt användningsfall.




Siffror och numeriska värden

MySQL innehåller en rad numeriska datatyper som är lämpliga för olika scenarier. Den lämpliga typen beror på den exakta karaktären hos de värden du planerar att lagra samt dina precisionskrav.


Heltal

heltal datatyp är en kategori av typer som används för att lagra tal utan bråktal eller decimaler. Dessa kan vara antingen positiva eller negativa värden, och olika heltalstyper kan lagra olika intervall av tal. Heltalstyper med mindre intervall av acceptabla värden tar mindre plats än de med bredare intervall.

Den grundläggande listan över heltalstyper inkluderar följande:

Heltalstyp Längd Tillämpligt signerat intervall Tillämpligt osignerat intervall
TINYINT 1 byte -128 till 127 0 till 255
SMALLINT 2 byte -32768 till 32767 0 till 65535
MEDIUMINT 3 byte -8388608 till 8388607 0 till 16777215
INT 4 byte -2147483648 till 2147483647 0 till 4294967295
BIGINT 8 byte -2^63 till -2^63-1 0 till 2^64-1

Typerna ovan är begränsade av deras giltiga intervall. Alla värden utanför intervallet kommer att resultera i ett fel.

Utöver de ovan nämnda typerna känner MySQL även igen ett alias som heter SERIAL . Markera en kolumn som SERIAL ger den dessa egenskaper:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE . Detta används som en förkortning för vanliga primärnyckelkolumnegenskaper. Kolumnen kommer automatiskt att tilldela ett nytt unikt värde när en post läggs till.



Fast punkt

Typer av fasta punkter används för att kontrollera mängden precision eller specificitet möjlig för ett tal med decimaler. I MySQL kan detta kontrolleras genom att manipulera två faktorer:precision och skala.

Precision är det maximala antalet totala siffror som ett nummer kan ha. Däremot skala är antalet siffror till höger om decimalkomma. Genom att manipulera dessa siffror kan du kontrollera hur stora bråkdelar och icke-bråkdelar av ett tal tillåts vara.

Dessa två argument används för att styra godtycklig precision med numeric eller decimal datatyper (dessa två typer är synonyma i MySQL). Den numeric typ tar noll till två argument.

Utan argument definieras kolumnen som att ha en precision på 10 och en skala på 0. Det betyder att kolumnen kan innehålla upp till 10 siffror, men ingen av dessa kan vara efter decimalkomma:

NUMERIC

När ett enda argument tillhandahålls tolkas det som precisionen för kolumnen med skalan inställd på 0. Detta gör att du effektivt kan ange det maximala antalet siffror i ett heltalsliknande tal (inga bråk- eller decimalkomponenter). Om du till exempel behöver ett 5-siffrigt heltal kan du ange:

NUMERIC(5)

Ange precision följt av skala när du konfigurerar en kolumn med båda kontrollerna. MySQL kommer att runda av decimalkomponenten för varje inmatning till rätt antal siffror med hjälp av skalantalet. MySQL kommer att använda precisionen och skalan för att bestämma hur många siffror som är tillåtna på vänster sida av decimalkomman. Om en post överskrider det tillåtna antalet siffror kommer MySQL att ge ett felmeddelande.

Till exempel kan vi ange en kolumn med en total precision på 5 och en skala på 2:

NUMERIC(5, 2)

Den här kolumnen skulle ha följande beteende:

Indatavärde Avrundat värde Godkänd (passar precision)?
400.28080 400.28 Ja
8.332799 8.33 Ja
11799.799 11799,80 Nej
11799 11799 Nej
2802.27 2802.27 Nej


Flytpunkt

Flyttal är ett annat sätt att uttrycka decimaltal, men utan exakt, konsekvent precision. Istället har flyttalstyper bara ett koncept med maximal precision som ofta är relaterat till hårdvarans arkitektur och plattform.

Till exempel, för att begränsa en flyttalskolumn till 8 siffrors precision, kan du använda FLOAT typ, som lagrar resultat med 4 byte med allt från 0 till 23 siffror med precision:

FLOAT(8)

På samma sätt är DOUBLE typ använder 8 byte för att lagra data och kan använda precisioner på 24 till 53 siffror.

På grund av dessa designval kan flyttalsnummer fungera effektivt med tal med ett stort antal decimaler, men inte alltid exakt. Den interna representationen av siffror kan orsaka små skillnader mellan indata och utdata. Detta kan orsaka oväntat beteende när man jämför värden, gör flyttal-matematik eller utför operationer som kräver exakta värden.



Flytpunkt vs numerisk

Båda flyttalstalen tillhandahålls av typer som FLOAT och DOUBLE och fixpunktsnummer som tillhandahålls av NUMERIC eller DECIMAL typer kan användas för att lagra decimalvärden. Hur vet du vilken du ska använda?

Den allmänna regeln är att om du behöver exakthet i dina beräkningar, NUMERIC typ är alltid det bättre valet. NUMERIC typ kommer att lagra värden exakt som de tillhandahålls, vilket innebär att resultaten är helt förutsägbara när man hämtar eller beräknar över värden. NUMERIC typ kallas godtycklig precision eftersom du anger mängden precision som typen kräver och den kommer att lagra den exakta mängden siffror i fältet.

Däremot typer som FLOAT och DOUBLE är olika precisionstyper. Mängden precision de bibehåller beror på ingångsvärdet. När de når slutet av sin tillåtna precisionsnivå kan de runda av de återstående siffrorna, vilket leder till skillnader mellan de inlämnade och hämtade värdena.

Så när skulle du använda olika precisionstyper? Varierande precisionstyper som FLOAT och DOUBLE är väl lämpade för scenarier där exakta värden inte är nödvändiga (till exempel om de ändå ska avrundas) och när hastigheten är mycket värdefull. Variabel precision ger generellt prestandafördelar jämfört med NUMERIC typ.




Strängtyper

MySQL:s teckentyper och strängtyper kan placeras i två kategorier:fast längd och variabel längd . Valet mellan dessa två påverkar hur MySQL allokerar utrymme för varje värde och hur det validerar indata.

Den enklaste teckenbaserade datatypen i MySQL är char typ. Utan argument, char typ accepterar ett enstaka tecken som indata:

CHAR

När ett positivt heltal anges i deklarationen visas char kolumnen lagrar en teckensträng med fast längd som är lika med antalet angivna tecken:

CHAR(10)

Om en sträng är försedd med färre tecken kommer tomma mellanslag att läggas till för att fylla på längden:

Indata # inmatade tecken Lagrat värde # lagrade tecken
'träd' 4 'träd      ' 10

Om en sträng ges med fler än det tillåtna antalet tecken, kommer MySQL att visa ett fel. Som ett undantag från denna regel, om de överfulla tecknen alla är mellanslag, kommer MySQL helt enkelt att trunkera de överflödiga mellanrummen för att passa fältet.

Alternativet till tecken med fast längd är fält med variabel längd. För detta tillhandahåller MySQL varchar typ. varchar typ lagrar tecken utan fast storlek. Till skillnad från char , varchar kan inte användas utan att ange det maximala antalet tecken som ska lagras.

Genom att definiera en varchar med ett positivt heltal kan du ställa in en maximal stränglängd:

VARCHAR(10)

Detta skiljer sig från att använda char skriv med ett heltal i den varchar kommer inte att fylla ut värdet om inmatningen inte uppfyller den maximala fältlängden:

Indata # inmatade tecken Lagrat värde # lagrade tecken
'träd' 4 'träd' 4

Om strängen är större än den maximala längden kommer MySQL att ge ett fel. Samma trunkeringsbeteende som finns i char fält förekommer här:om de överfulla tecknen är mellanslag, kommer de att trunkeras för att passa inom den maximala teckenlängden.

MySQL stöder även binary och varbinary datatyper. Dessa fungerar på liknande sätt som char och varchar typer, men lagra binära strängar snarare än teckensträngar. Detta har konsekvenser för hur de lagras och opereras (för saker som jämförelser, sortering etc.).

För binary och varbinary typer, det heltal som anges när kolumntypen definieras representerar antalet byte istället för antalet tecken.

Två andra datatyper som MySQL tillhandahåller för strängar och teckenlagring är blob och text . Dessa typer fungerar på samma sätt som varchar och varbinary typer respektive och är avsedda för förvaring av stora föremål. De fungerar för det mesta på samma sätt som sina motsvarigheter, men har några skillnader som att inte börja kunna ha standardvärden och att kräva en prefixlängd när du skapar ett index.



Booleans

MySQL har faktiskt inte en ursprunglig boolesk typ för att representera sanna och falska värden.

MySQL känner igen typerna BOOL eller BOOLEAN i ett försök för kompatibilitet med andra databassystem. Dess interna implementering använder dock en TINYINT(1) kolumn för att lagra värdena och tolkar dem som sant eller falskt baserat på en uppsättning regler.

Vid tolkning av numeriska värden i ett booleskt sammanhang, värdet 0 anses vara falsk. Alla värden som inte är noll anses sanna.

MySQL känner igen de booleska bokstaverna TRUE och FALSE och konverterar TRUE till 1 och FALSE till 0 när du lagrar dem.



Datum och tid

MySQL har stöd för att representera datum, tider och kombinationer av de två.


Datum

date typ kan lagra ett datum utan ett tillhörande tidsvärde:

DATE

Vid bearbetning av indata för date kolumner, kan MySQL tolka olika format för att bestämma rätt datum att lagra. Delarna måste dock alltid komma i samma ordningsföljd:år, månad och sedan dag. STR_TO_DATE() Funktionen är tillgänglig för att hjälpa till att konvertera andra datumformat till ett format som MySQL tolkar korrekt.

Vid visning av datum använder MySQL YYYY-MM-DD formatera. Du kan använda DATE_FORMAT() funktion för att formatera utdata i andra format.

date typ kan lagra värden från 1000-01-01 till 9999-12-31 .



Tid

time datatyp kan lagra en specifik tid på dagen utan en associerad tidszon eller datum.

Vid bearbetning av indata för time kolumner, kan MySQL tolka flera format för att bestämma rätt tid att lagra. När indata har kolon tolkas det vanligtvis som hh:mm:ss . Alla förkortade värden (med endast en kolumn) kommer att tolkas som att använda hh:mm . När ingången inte gör det har kolon, bearbetas tiden för att fylla upp det minsta värdet först. Till exempel, 1045 tas som 10 minuter och 45 sekunder.

MySQL stöder också bråkdelar av sekunder om ett decimalkomma anges. Den lagrar upp till 6 siffror med precision efter decimalen. Värden i time kolumner kan variera från -838:59:59.000000 till 838:59:59.000000 .

När tidsvärden visas använder MySQL hh:mm:ss formatera. Precis som med datum tillhandahålls en funktion som heter TIME_FORMAT() för att visa tidsvärden med andra format.




Tidsstämplar och datumtid

MySQL kan representera tidsstämplar, en kombination av ett datum och en tid som används för att representera ett specifikt ögonblick i tiden, i två olika varianter:med timestamp typ och datetime typ.

datetime typ kan representera värden från 1000-01-01 00:00:00 till 9999-12-31 23:59:59 . Den kan också inkludera bråkdelar av sekunder med upp till sex siffror som liknar time typ.

timestamp typ kan representera värden från 1970-01-01 00:00:01 UTC till 2038-01-19 03:14:07 UTC. Den klarar också bråkdelar av sekunder. När du lagrar timestamp värden, konverteras alla värden från den givna tidszonen till UTC för lagring och konverteras tillbaka till den lokala tidszonen vid hämtning. datetime typ gör inte detta.

Från MySQL 8.0.19 och framåt kan du inkludera en tidszonförskjutning när du lagrar en timestamp för att explicit ställa in tidszonen för det lagrade värdet. Du gör detta genom att inkludera ett värde efter tidskomponenten, utan mellanslag för att indikera offset. Intervallet av accepterade värden går från -14:00 till +14:00 , som representerar förskjutningen av det lagrade värdet från UTC.

När du bestämmer om du ska lagra datum- och tidsvärden med datetime eller timezone typer är det ofta bra att separera dem efter vad de är bäst för.

Tänk på datetime värden som ett specifikt datum och tid, i förhållande till kalendern och klockan varhelst den hämtas. Om en person går och lägger sig vid 23:00 på natten, en datetime värde kan representera det värdet, oavsett vilken tidszon personen befinner sig i för närvarande.

Å andra sidan, timezone värden är bäst på att representera ett specifikt ögonblick i tid som är otvetydigt över tidszoner. För att skicka en inbjudan till videosamtal, en timezone värde skulle kunna se till att mötet äger rum samtidigt för alla, oavsett vilken tidszon deltagaren befinner sig i.



Andra användbara typer

Tillsammans med de typer som vi täckte med lite djup ovan, finns det ytterligare typer som är användbara i specifika scenarier. Vi kommer att täcka dessa kort för att ge dig en uppfattning om hur du använder dem och när de kan vara användbara.


Räknade och uppräknade typer

Två relaterade typer som tillåter användare att diktera giltiga värden för en kolumn är enum och set typer.

enum typ är en strängtyp som låter användaren definiera en samling giltiga värden när kolumnen skapas. Alla värden som matchar ett av de definierade värdena accepteras och alla andra värden avvisas. Detta fungerar på samma sätt som en rullgardinsmeny genom att ett val kan göras från en specifik uppsättning alternativ. Till exempel en enum kallas season kan skapas med värdena winter , spring , summer och autumn .

För att skapa en enum kolumn, ange typen som enum , som ger de möjliga värdena som strängar, separerade med kommatecken, inom en uppsättning parenteser, så här:

season ENUM('winter', 'spring', 'summer', 'autumn')

En liknande typ av användardefinierad typ är set typ. Som enum typ, set typer tillåter användare att ange giltiga värden som strängar vid definition. Skillnaden mellan dessa två typer är den i en set , kan mer än ett värde lagras för varje post.

Om du till exempel behövde en kolumn för att representera veckodagarna volontärer är tillgängliga för att arbeta, kan du ha en set kolumn så här:

availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')

När du anger värden för availability kolumn som vi just skapade ger du en enda sträng med kommatecken som skiljer alla dagar som volontären är tillgänglig. Till exempel:

'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'

För set typer i MySQL, dubbletter av värden i inmatning tas alltid bort och vid hämtning följer värdena den ordning som används i set definition oavsett ordningsföljd vid inmatning i kolumnen.



JSON

MySQL stöder kolumner i JSON med json typ. Data lagras som json lagras i binärt för snabbare exekvering och bearbetning så att servern inte behöver tolka en sträng för att fungera på JSON värden.

JSON

För att använda JSON kolumner, tillhandahåller MySQL ett antal funktioner för att arbeta med värden i dokumentet.




Slutsats

I den här artikeln har vi täckt många av de vanligaste datatyperna som är användbara när du arbetar med MySQL-databaser. Det finns ytterligare typer som inte tas upp i den här guiden som är användbara att veta om, men dessa utgör en bra utgångspunkt för de flesta användningsfall.

Det är viktigt att använda typsystemet på rätt sätt så att du kan kontrollera giltiga värden och arbeta med data som förväntat. Det finns fallgropar du kan stöta på om du väljer en typ som inte passar dina data, så att tänka efter innan du bestämmer dig för en datatyp är i de flesta fall värt besväret.

Om du använder Prisma Client för att arbeta med dina MySQL-databaser, kan du hitta en mappning mellan några av de vanliga MySQL- och Prisma-typerna i Prismas MySQL-dataanslutningsdokument.




  1. MySQL Group By och Summa totalt värde för annan kolumn

  2. hämta flera kolumner gruppera efter datumintervall

  3. VÄLJ * FRÅN flera tabeller. MySQL

  4. PostgreSQL:Hur skickar man parametrar från kommandoraden?