Introduktion
Et af de primære træk ved relationelle databaser generelt er evnen til at definere skemaer eller tabelstrukturer, der præcist specificerer formatet af de data, de vil indeholde. Dette gøres ved at foreskrive de kolonner, som disse strukturer indeholder, sammen med deres datatype og eventuelle begrænsninger.
Datatyper angiver et generelt mønster for de data, de accepterer og gemmer. Værdier skal overholde de krav, de skitserer, for at blive accepteret af MySQL. Selvom det er muligt at definere brugerdefinerede krav, giver datatyper de grundlæggende byggeklodser, der gør det muligt for MySQL at validere input og arbejde med dataene ved hjælp af passende operationer.
MySQL omfatter en bred vifte af datatyper, der bruges til at mærke og validere, at værdier er i overensstemmelse med passende typer. I denne vejledning vil vi diskutere de mest almindelige datatyper, der er tilgængelige i MySQL, de forskellige input- og outputformater, de bruger, og hvordan man konfigurerer forskellige felter, så de opfylder dine applikationers behov.
Hvad er datatyperne i MySQL?
Før vi går i detaljer, lad os tage et bredt overblik over, hvilke datatyper MySQL leverer.
MySQL understøtter et rimeligt udvalg af datatyper, der egner sig til forskellige typer simple og komplekse data. Disse omfatter:
TINYINT
SMALLINT
MEDIUMINT
INT
STORT
DECIMAL
NUMERIC
FLYDE
DOUBLE
BIT
DATO
DATETIME
TIMESTAMP
TID
ÅR
CHAR
VARCHAR
BINÆR
VARBINARY
BLOB
TEKST
ENUM
SET
GEOMETRY
PUNKT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
JSON
Vi vil dække de mest almindelige af disse mere i dybden i denne vejledning.
Kom godt i gang med MySQL-datatyper
Når du kommer i gang med typer, er det vigtigt at huske, at typer alene ikke altid er en komplet løsning til datavalidering, men en komponent. Andre databaseværktøjer, som f.eks. begrænsninger, spiller også en rolle i at definere korrekthed. Alligevel er datatyper ofte den første forsvarslinje mod ugyldige data.
I mange tilfælde er de generelle typer, der leveres af MySQL, passende til den slags data, du vil gemme. Mens du f.eks. kunne gemme koordinaterne for et geometrisk punkt i to forskellige talkolonner, kan det angivne punkt
type er specialbygget til at gemme og validere netop denne type information. Når du vælger typer, skal du kontrollere, at du bruger den mest specifikke type, der er relevant for din use case.
Tal og numeriske værdier
MySQL indeholder en række numeriske datatyper, der egner sig til forskellige scenarier. Den passende type afhænger af den nøjagtige karakter af de værdier, du planlægger at gemme, samt dine præcisionskrav.
Heltal
heltal datatype er en kategori af typer, der bruges til at gemme tal uden brøker eller decimaler. Disse kan være enten positive eller negative værdier, og forskellige heltaltyper kan gemme forskellige talinterval. Heltalstyper med mindre intervaller af acceptable værdier fylder mindre end dem med bredere intervaller.
Den grundlæggende liste over heltalstyper inkluderer følgende:
Heltalstype | Længde | Gældende signeret interval | Gældende usigneret område |
---|---|---|---|
TINYINT | 1 bytes | -128 til 127 | 0 til 255 |
SMALLINT | 2 bytes | -32768 til 32767 | 0 til 65535 |
MEDIUMINT | 3 bytes | -8388608 til 8388607 | 0 til 16777215 |
INT | 4 bytes | -2147483648 til 2147483647 | 0 til 4294967295 |
STORT | 8 bytes | -2^63 til -2^63-1 | 0 til 2^64-1 |
Ovenstående typer er begrænset af deres gyldige rækkevidde. Enhver værdi uden for området vil resultere i en fejl.
Ud over de ovenfor nævnte typer genkender MySQL også et alias kaldet SERIAL
. Markering af en kolonne som SERIAL
vil give den disse egenskaber:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. Dette bruges som en stenografi for almindelige egenskaber for primær nøglekolonne. Kolonnen vil automatisk tildele en ny unik værdi, hver gang en post tilføjes.
Fast punkt
Fastpunktstyper bruges til at kontrollere mængden af præcision eller specificitet mulig for et tal med decimaler. I MySQL kan dette styres ved at manipulere to faktorer:præcision og skala.
Nøjagtighed er det maksimale antal cifre, som et tal kan have. I modsætning hertil skaler er antallet af cifre til højre for decimaltegnet. Ved at manipulere disse tal kan du kontrollere, hvor store brøk- og ikke-brøkkomponenterne af et tal må være.
Disse to argumenter bruges til at kontrollere vilkårlig præcision ved hjælp af den numeriske
eller decimal
datatyper (disse to typer er synonyme i MySQL). Den numeriske
type tager nul til to argumenter.
Uden argumenter er kolonnen defineret som at have en præcision på 10 og en skala på 0. Det betyder, at kolonnen kan indeholde op til 10 cifre, men ingen af disse kan være efter decimaltegnet:
NUMERIC
Når et enkelt argument er angivet, fortolkes det som nøjagtigheden af kolonnen med skalaen sat til 0. Dette giver dig effektivt mulighed for at angive det maksimale antal cifre i et heltalslignende tal (ingen brøk- eller decimalkomponenter). For eksempel, hvis du har brug for et 5-cifret heltal, kan du angive:
NUMERIC(5)
Angiv præcision efterfulgt af skala, når du konfigurerer en kolonne ved hjælp af begge kontroller. MySQL vil afrunde decimalkomponenten af enhver input til det korrekte antal cifre ved hjælp af skalanummeret. MySQL vil bruge præcisionen og skalaen til at bestemme, hvor mange cifre der er tilladt på venstre side af decimaltegnet. Hvis en indtastning overstiger det tilladte antal cifre, vil MySQL producere en fejl.
For eksempel kan vi angive en kolonne med en total præcision på 5 og en skala på 2:
NUMERIC(5, 2)
Denne kolonne vil have følgende funktionsmåde:
Inputværdi | Afrundet værdi | Accepteret (passer til præcision)? |
---|---|---|
400.28080 | 400,28 | Ja |
8.332799 | 8.33 | Ja |
11799.799 | 11799,80 | Nej |
11799 | 11799 | Nej |
2802.27 | 2802.27 | Nej |
flydende komma
Flydende kommatal er en anden måde at udtrykke decimaltal på, men uden nøjagtig, konsekvent præcision. I stedet har typer med flydende komma kun et koncept med maksimal præcision, som ofte er relateret til hardwarens arkitektur og platform.
For f.eks. at begrænse en kolonne med flydende komma til 8 cifres præcision, kan du bruge FLOAT
type, som gemmer resultater ved hjælp af 4 bytes med alt fra 0 til 23 cifres præcision:
FLOAT(8)
Tilsvarende er DOUBLE
type bruger 8 bytes til at gemme data og kan bruge præcision på 24 til 53 cifre.
På grund af disse designvalg kan flydende kommatal arbejde effektivt med tal med et stort antal decimaler, men ikke altid nøjagtigt. Den interne repræsentation af tal kan forårsage små forskelle mellem input og output. Dette kan forårsage uventet adfærd, når man sammenligner værdier, laver matematik med flydende komma eller udfører operationer, der kræver nøjagtige værdier.
flydende komma vs numerisk
Begge tal med flydende decimal leveret af typer som FLOAT
og DOUBLE
og fikspunktsnumre leveret af NUMERIC
eller DECIMAL
typer kan bruges til at gemme decimalværdier. Hvordan ved du, hvilken du skal bruge?
Den generelle regel er, at hvis du har brug for nøjagtighed i dine beregninger, er NUMERIC
type er altid det bedste valg. NUMERIC
type vil gemme værdier nøjagtigt, som de er angivet, hvilket betyder, at resultaterne er fuldstændig forudsigelige, når der hentes eller beregnes over værdier. NUMERIC
type kaldes vilkårlig præcision, fordi du angiver mængden af præcision, som typen kræver, og den vil gemme det nøjagtige antal cifre i feltet.
Derimod typer som FLOAT
og DOUBLE
er variable præcisionstyper. Mængden af præcision, de opretholder, afhænger af inputværdien. Når de når slutningen af deres tilladte præcisionsniveau, kan de runde de resterende cifre, hvilket fører til forskelle mellem de indsendte og hentede værdier.
Så hvornår ville du bruge variable præcisionstyper? Variable præcisionstyper som FLOAT
og DOUBLE
er velegnede til scenarier, hvor nøjagtige værdier ikke er nødvendige (f.eks. hvis de alligevel bliver afrundet), og hvor hastigheden er meget værdifuld. Variabel præcision vil generelt give ydeevnefordele i forhold til NUMERIC
type.
Strengtyper
MySQL's tegntyper og strengtyper kan placeres i to kategorier:fast længde og variabel længde . Valget mellem disse to påvirker, hvordan MySQL allokerer plads til hver værdi, og hvordan det validerer input.
Den enkleste tegnbaserede datatype i MySQL er char
type. Uden argumenter er char
type accepterer et enkelt tegn som input:
CHAR
Når et positivt heltal er angivet i erklæringen, vil char
kolonne gemmer en tegnstreng med fast længde svarende til antallet af angivne tegn:
CHAR(10)
Hvis en streng er forsynet med færre tegn, vil der blive tilføjet tomme mellemrum for at udfylde længden:
Input | # input-tegn | Gemt værdi | # gemte tegn |
---|---|---|---|
'træ' | 4 | 'træ ' | 10 |
Hvis en streng er givet med et større antal end det tilladte antal tegn, vil MySQL rejse en fejl. Som en undtagelse fra denne regel, hvis de overfyldte tegn alle er mellemrum, vil MySQL simpelthen afkorte de overskydende mellemrum, så de passer til feltet.
Alternativet til felter med fast længde er felter med variabel længde. Til dette giver MySQL varchar
type. varchar
type gemmer tegn uden fast størrelse. I modsætning til char
, varchar
kan ikke bruges uden at angive det maksimale antal tegn, der skal gemmes.
Ved at definere en varchar
med et positivt heltal kan du indstille en maksimal strenglængde:
VARCHAR(10)
Dette adskiller sig fra at bruge char
skriv med et heltal i den varchar
vil ikke udfylde værdien, hvis input ikke opfylder den maksimale feltlængde:
Input | # input-tegn | Gemt værdi | # gemte tegn |
---|---|---|---|
'træ' | 4 | 'træ' | 4 |
Hvis strengen er større end den maksimale længde, vil MySQL give en fejl. Den samme trunkeringsadfærd, som er til stede i char
felter forekommer her:Hvis de overfyldte tegn er mellemrum, vil de blive afkortet, så de passer inden for den maksimale tegnlængde.
MySQL understøtter også binær
og varbinary
datatyper. Disse fungerer på samme måde som char
og varchar
typer, men gem binære strenge i stedet for tegnstrenge. Dette har betydning for, hvordan de opbevares og betjenes (for ting som sammenligninger, sortering osv.).
For binær
og varbinary
typer, repræsenterer det heltal, der gives ved definition af kolonnetypen, antallet af bytes i stedet for antallet af tegn.
To andre datatyper, som MySQL leverer til strenge og tegnlagring, er blob
og tekst
. Disse typer fungerer på samme måde som varchar
og varbinary
typer og er beregnet til opbevaring af store genstande. De fungerer stort set på samme måde som deres modstykker, men har nogle få forskelle som f.eks. at de ikke begynder at kunne have standardværdier og kræver en præfikslængde, når du opretter et indeks.
Booleans
MySQL har faktisk ikke en oprindelig boolesk type til at repræsentere sande og falske værdier.
MySQL genkender typerne BOOL
eller BOOLEAN
i et forsøg på kompatibilitet med andre databasesystemer. Dens interne implementering bruger dog en TINYINT(1)
kolonne for at gemme værdierne og fortolker dem som sande eller falske baseret på et sæt regler.
Ved fortolkning af numeriske værdier i en boolesk kontekst, værdien af 0
anses for falsk. Alle værdier, der ikke er nul, betragtes som sande.
MySQL genkender de booleske bogstaver TRUE
og FALSK
og konverterer TRUE
til 1 og FALSK
til 0, når du gemmer dem.
Datoer og klokkeslæt
MySQL har understøttelse til at repræsentere datoer, tidspunkter og kombinationer af de to.
Datoer
datoen
type kan gemme en dato uden en tilknyttet tidsværdi:
DATE
Ved behandling af input for dato
kolonner, kan MySQL fortolke forskellige formater for at bestemme den korrekte dato for lagring. Komponenterne skal dog altid komme i samme rækkefølge:år, måned og derefter dag. STR_TO_DATE()
funktion er tilgængelig for at hjælpe med at konvertere andre datoformater til et format MySQL vil fortolke korrekt.
Når du viser datoer, bruger MySQL DATE_FORMAT()
funktion til at formatere output i andre formater.
datoen
type kan gemme værdier fra 1000-01-01
til 9999-12-31
.
Tid
tiden
datatypen kan gemme et bestemt tidspunkt på dagen uden en tilknyttet tidszone eller dato.
Ved behandling af input for tid
kolonner, kan MySQL fortolke flere formater for at bestemme den korrekte tid til lagring. Når input har koloner, fortolkes det generelt som tt:mm:ss
. Enhver forkortet værdi (med kun én kolonne) vil blive fortolket som brug af tt:mm
. Når input ikke gør det har kolon, behandles tiden til at fylde den mindste værdi først. For eksempel 1045
tages som 10 minutter og 45 sekunder.
MySQL understøtter også brøkdele sekunder, hvis der er givet et decimaltegn. Den gemmer op til 6 cifre med præcision efter decimalen. Værdier i tid
kolonner kan variere fra -838:59:59.000000
til 838:59:59.000000
.
Ved visning af tidsværdier bruger MySQL tt:mm:ss
format. Som med datoer leveres en funktion kaldet TIME_FORMAT()
for at vise tidsværdier ved hjælp af andre formater.
Tidsstempler og datetime
MySQL kan repræsentere tidsstempler, en kombination af en dato og et klokkeslæt, der bruges til at repræsentere et bestemt tidspunkt i to forskellige variationer:ved at bruge tidsstemplet
type og datetime
type.
datetime
type kan repræsentere værdier fra 1000-01-01 00:00:00
til 9999-12-31 23:59:59
. Det kan også indeholde brøkdele af sekunder på op til seks cifre, der ligner tiden
type.
tidsstemplet
type kan repræsentere værdier fra 1970-01-01 00:00:01
UTC til 2038-01-19 03:14:07
UTC. Den kan også klare brøkdele sekunder. Når du gemmer tidsstempel
værdier, konverteres alle værdier fra den givne tidszone til UTC til lagring og konverteres tilbage til den lokale tidszone ved hentning. datetime
type gør ikke dette.
Fra MySQL 8.0.19 og frem kan du inkludere en tidszoneforskydning, når du gemmer et tidsstempel
for eksplicit at indstille tidszonen for den lagrede værdi. Det gør du ved at inkludere en værdi efter tidskomponenten, uden mellemrum til at angive offset. Udvalget af accepterede værdier går fra -14:00
til +14:00
, som repræsenterer forskydningen af den lagrede værdi fra UTC.
Når du beslutter dig for, om du vil gemme dato- og tidsværdier ved hjælp af datetime
eller tidszone
typer, er det ofte nyttigt at adskille dem efter, hvad de er bedst til.
Tænk på datetime
værdier som en bestemt dato og klokkeslæt i forhold til kalenderen og uret, uanset hvor det er hentet. Hvis en person går i seng kl. 23.00 om natten, er en datetime
værdi kan repræsentere denne værdi, uanset hvilken tidszone personen befinder sig i i øjeblikket.
På den anden side, tidszone
værdier er bedst til at repræsentere et bestemt tidspunkt i tiden, der er utvetydigt på tværs af tidszoner. For at sende en invitation til videoopkald, en tidszone
værdi ville være i stand til at sikre, at mødet finder sted på samme tid for alle, uanset hvilken tidszone deltageren befinder sig i.
Andre nyttige typer
Sammen med de typer, vi har dækket med en vis dybde ovenfor, er der yderligere typer, der er nyttige i specifikke scenarier. Vi dækker disse kort for at give dig en idé om, hvordan du bruger dem, og hvornår de kan være nyttige.
Optalte og sæt typer
To relaterede typer, der tillader brugere at diktere de gyldige værdier for en kolonne, er enum
og sæt
typer.
enum
type er en strengtype, der giver brugeren mulighed for at definere en samling af gyldige værdier, når kolonnen oprettes. Enhver værdi, der matcher en af de definerede værdier, accepteres, og alle andre værdier afvises. Dette fungerer på samme måde som en rullemenu, idet der kan foretages et valg fra et specifikt sæt af muligheder. For eksempel en enum
kaldet sæson
kunne oprettes med værdierne winter
, spring
, sommer
og efterår
.
For at oprette en enum
kolonne, skal du angive typen som enum
, der giver de mulige værdier som strenge, adskilt af kommaer, inden for et sæt parenteser, som denne:
season ENUM('winter', 'spring', 'summer', 'autumn')
En lignende type brugerdefineret type er sættet
type. Ligesom enum
type, sæt
typer tillader brugere at angive gyldige værdier som strenge ved definition. Forskellen mellem disse to typer er den i et sæt
, kan der gemmes mere end én værdi for hver post.
Hvis du f.eks. havde brug for en kolonne til at repræsentere de dage i ugen, frivillige er tilgængelige til at arbejde, kunne du have et sæt
kolonne som denne:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
Når du indtaster værdier for tilgængelighed
kolonne, vi lige har oprettet, angiver du en enkelt streng med kommaer, der adskiller alle de dage, hvor den frivillige er tilgængelig. For eksempel:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
For set
typer i MySQL fjernes duplikerede værdier i input altid og ved hentning følger værdierne den rækkefølge, der er brugt i sættet
definition uanset rækkefølgen ved indtastning i kolonnen.
JSON
MySQL understøtter kolonner i JSON ved hjælp af json
type. Data gemt som json
er gemt i binær for hurtigere eksekvering og behandling, så serveren ikke skal fortolke en streng for at fungere på JSON
værdier.
JSON
For at betjene JSON
kolonner, giver MySQL en række funktioner til at arbejde med værdier i dokumentet.
Konklusion
I denne artikel har vi dækket en masse af de mest almindelige datatyper, der er nyttige, når du arbejder med MySQL-databaser. Der er yderligere typer, som ikke er dækket af denne vejledning, og som er nyttige at kende til, men disse repræsenterer et godt udgangspunkt for de fleste anvendelsestilfælde.
Det er vigtigt at bruge typesystemet korrekt, så du kan kontrollere gyldige værdier og operere på data som forventet. Der er faldgruber, du kan løbe ind i, hvis du vælger en type, der ikke passer til dine data, så det er i de fleste tilfælde umagen værd at overveje det, før du forpligter dig til en datatype.
Hvis du bruger Prisma Client til at arbejde med dine MySQL-databaser, kan du finde en kortlægning mellem nogle af de almindelige MySQL- og Prisma-typer i Prismas MySQL-datakonnektordokumenter.