sql >> Database teknologi >  >> RDS >> Mysql

En introduktion til MySQL-datatyper


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 ÅÅÅÅ-MM-DD format. Du kan bruge 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.




  1. SQLite og database initialisering

  2. Sådan finder du den sidste dag i måneden i SQL Server

  3. Sådan får du sidste 12 måneders data i MySQL

  4. EXTRACT() Eksempler – MySQL