Inleiding
Een van de belangrijkste kenmerken van relationele databases in het algemeen is de mogelijkheid om schema's of tabelstructuren te definiëren die exact het formaat specificeren van de gegevens die ze zullen bevatten. Dit wordt gedaan door de kolommen voor te schrijven die deze structuren bevatten, samen met hun gegevenstype en eventuele beperkingen.
Gegevenstypen specificeren een algemeen patroon voor de gegevens die ze accepteren en opslaan. Waarden moeten voldoen aan de vereisten die ze schetsen om door MySQL te worden geaccepteerd. Hoewel het mogelijk is om aangepaste vereisten te definiëren, bieden gegevenstypen de basisbouwstenen waarmee MySQL invoer kan valideren en met de gegevens kan werken met behulp van de juiste bewerkingen.
MySQL bevat een breed scala aan gegevenstypen die worden gebruikt om te labelen en te valideren dat waarden voldoen aan de juiste typen. In deze handleiding bespreken we de meest voorkomende gegevenstypen die beschikbaar zijn in MySQL, de verschillende invoer- en uitvoerformaten die ze gebruiken en hoe u verschillende velden kunt configureren om aan de behoeften van uw toepassingen te voldoen.
Wat zijn de gegevenstypen in MySQL?
Laten we, voordat we in detail treden, een algemeen beeld geven van de gegevenstypen die MySQL biedt.
MySQL ondersteunt een redelijk scala aan gegevenstypen die geschikt zijn voor verschillende soorten eenvoudige en complexe gegevens. Deze omvatten:
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
We zullen in deze handleiding dieper ingaan op de meest voorkomende hiervan.
Aan de slag met MySQL-gegevenstypen
Als u aan de slag gaat met typen, is het belangrijk om te onthouden dat typen alleen niet altijd een complete oplossing voor gegevensvalidatie zijn, maar een onderdeel. Andere databasetools, zoals beperkingen, spelen ook een rol bij het bepalen van correctheid. Toch zijn gegevenstypen vaak de eerste verdedigingslinie tegen ongeldige gegevens.
In veel gevallen zijn de algemene typen die door MySQL worden geleverd, geschikt voor het soort gegevens dat u opslaat. Terwijl u bijvoorbeeld de coördinaten van een geometrisch punt in twee verschillende nummerkolommen zou kunnen opslaan, is het opgegeven point
type is speciaal gebouwd om precies dit soort informatie op te slaan en te valideren. Controleer bij het kiezen van typen of u het meest specifieke type gebruikt dat van toepassing is op uw gebruik.
Getallen en numerieke waarden
MySQL bevat een reeks numerieke gegevenstypen die geschikt zijn voor verschillende scenario's. Het juiste type hangt af van de exacte aard van de waarden die u wilt opslaan en van uw precisievereisten.
Gehele getallen
Het geheel getal gegevenstype is een categorie van typen die worden gebruikt om getallen op te slaan zonder breuken of decimalen. Dit kunnen positieve of negatieve waarden zijn, en verschillende typen gehele getallen kunnen verschillende reeksen getallen bevatten. Integer-typen met een kleiner bereik van acceptabele waarden nemen minder ruimte in beslag dan die met een groter bereik.
De basislijst van integer-typen omvat het volgende:
Geheel getal | Lengte | Toepasselijk ondertekend bereik | Toepasselijk niet-ondertekend bereik |
---|---|---|---|
TINYINT | 1 bytes | -128 tot 127 | 0 tot 255 |
SMALLINT | 2 bytes | -32768 tot 32767 | 0 tot 65535 |
MEDIUMINT | 3 bytes | -8388608 tot 8388607 | 0 tot 16777215 |
INT | 4 bytes | -2147483648 tot 2147483647 | 0 tot 4294967295 |
BIGINT | 8 bytes | -2^63 tot -2^63-1 | 0 tot 2^64-1 |
De bovenstaande typen zijn beperkt door hun geldige bereik. Elke waarde buiten het bereik resulteert in een fout.
Naast de bovengenoemde typen herkent MySQL ook een alias genaamd SERIAL
. Een kolom markeren als SERIAL
zal het deze eigenschappen geven:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. Dit wordt gebruikt als een afkorting voor algemene kolomeigenschappen van de primaire sleutel. De kolom zal automatisch een nieuwe unieke waarde toewijzen wanneer een record wordt toegevoegd.
Vast punt
Vaste-punttypes worden gebruikt om de hoeveelheid precisie te regelen of specificiteit mogelijk voor een getal met decimalen. In MySQL kan dit worden gecontroleerd door twee factoren te manipuleren:precisie en schaal.
Precisie is het maximale aantal cijfers dat een getal kan hebben. In tegenstelling, schaal is het aantal cijfers rechts van de komma. Door deze getallen te manipuleren, kun je bepalen hoe groot de fractionele en niet-fractionele componenten van een getal mogen zijn.
Deze twee argumenten worden gebruikt om willekeurige precisie te regelen met behulp van de numeric
of decimal
gegevenstypen (deze twee typen zijn synoniem in MySQL). De numeric
type heeft nul tot twee argumenten.
Zonder argumenten is de kolom gedefinieerd met een nauwkeurigheid van 10 en een schaal van 0. Dit betekent dat de kolom maximaal 10 cijfers kan bevatten, maar geen van deze mag achter de komma staan:
NUMERIC
Wanneer een enkel argument wordt opgegeven, wordt dit geïnterpreteerd als de precisie van de kolom met een schaal die is ingesteld op 0. Dit stelt u in staat om het maximale aantal cijfers in een geheel getal op te geven (geen fractionele of decimale componenten). Als u bijvoorbeeld een geheel getal van 5 cijfers nodig heeft, kunt u het volgende specificeren:
NUMERIC(5)
Geef precisie op gevolgd door schaal bij het configureren van een kolom met beide besturingselementen. MySQL rondt de decimale component van elke invoer af op het juiste aantal cijfers met behulp van het schaalnummer. MySQL gebruikt de precisie en schaal om te bepalen hoeveel cijfers er aan de linkerkant van de komma zijn toegestaan. Als een invoer het toegestane aantal cijfers overschrijdt, zal MySQL een fout produceren.
We kunnen bijvoorbeeld een kolom specificeren met een totale precisie van 5 en een schaal van 2:
NUMERIC(5, 2)
Deze kolom zou het volgende gedrag vertonen:
Invoerwaarde | Afgeronde waarde | Geaccepteerd (past bij precisie)? |
---|---|---|
400.28080 | 400.28 | Ja |
8.332799 | 8.33 | Ja |
11799.799 | 11799.80 | Nee |
11799 | 11799 | Nee |
2802.27 | 2802.27 | Nee |
Drijvend punt
Drijvende-kommagetallen zijn een andere manier om decimale getallen uit te drukken, maar zonder exacte, consistente precisie. In plaats daarvan hebben drijvende-kommatypes alleen een concept van een maximale precisie die vaak gerelateerd is aan de architectuur en het platform van de hardware.
Als u bijvoorbeeld een kolom met drijvende komma wilt beperken tot een nauwkeurigheid van 8 cijfers, kunt u de FLOAT
gebruiken type, dat resultaten opslaat met 4 bytes met een nauwkeurigheid van 0 tot 23 cijfers:
FLOAT(8)
Evenzo is de DOUBLE
type gebruikt 8 bytes om gegevens op te slaan en kan precisies van 24 tot 53 cijfers gebruiken.
Vanwege deze ontwerpkeuzes kunnen getallen met drijvende komma efficiënt werken met getallen met een groot aantal decimalen, maar niet altijd precies. De interne weergave van getallen kan kleine verschillen tussen de invoer en uitvoer veroorzaken. Dit kan onverwacht gedrag veroorzaken bij het vergelijken van waarden, het uitvoeren van berekeningen met drijvende komma of het uitvoeren van bewerkingen waarvoor exacte waarden nodig zijn.
Drijvende komma vs numeriek
Beide drijvende-kommagetallen geleverd door typen zoals FLOAT
en DOUBLE
en vaste puntnummers geleverd door de NUMERIC
of DECIMAL
typen kunnen worden gebruikt om decimale waarden op te slaan. Hoe weet je welke je moet gebruiken?
De algemene regel is dat als je exactheid in je berekeningen nodig hebt, de NUMERIC
type is altijd de betere keuze. De NUMERIC
type slaat waarden op precies zoals ze zijn opgegeven, wat betekent dat de resultaten volledig voorspelbaar zijn bij het ophalen of berekenen van waarden. De NUMERIC
type wordt willekeurige precisie genoemd omdat u de hoeveelheid precisie opgeeft die het type vereist en het exacte aantal cijfers in het veld zal opslaan.
Daarentegen typen zoals FLOAT
en DOUBLE
zijn variabele precisietypes. De mate van precisie die ze behouden, hangt af van de invoerwaarde. Wanneer ze het einde van hun toegestane nauwkeurigheidsniveau bereiken, kunnen ze de resterende cijfers afronden, wat leidt tot verschillen tussen de ingediende en opgehaalde waarden.
Dus wanneer zou u typen met variabele precisie gebruiken? Variabele precisietypes zoals FLOAT
en DOUBLE
zijn zeer geschikt voor scenario's waarin exacte waarden niet nodig zijn (bijvoorbeeld als ze toch worden afgerond) en wanneer snelheid zeer waardevol is. Variabele precisie biedt over het algemeen prestatievoordelen ten opzichte van de NUMERIC
typ.
Tekenreeksen
De teken- en tekenreekstypen van MySQL kunnen in twee categorieën worden ingedeeld:vaste lengte en variabele lengte . De keuze tussen deze twee beïnvloedt hoe MySQL ruimte toewijst voor elke waarde en hoe invoer wordt gevalideerd.
Het eenvoudigste op tekens gebaseerde gegevenstype binnen MySQL is de char
type. Zonder argumenten, de char
type accepteert een enkel teken als invoer:
CHAR
Wanneer een positief geheel getal wordt opgegeven in de declaratie, wordt de char
kolom zal een tekenreeks met een vaste lengte opslaan die gelijk is aan het aantal opgegeven tekens:
CHAR(10)
Als een string is voorzien van minder tekens, worden spaties toegevoegd om de lengte op te vullen:
Invoer | # invoertekens | Opgeslagen waarde | # opgeslagen tekens |
---|---|---|---|
'boom' | 4 | 'boom ' | 10 |
Als een string wordt gegeven met meer dan het toegestane aantal karakters, zal MySQL een foutmelding geven. Als uitzondering op deze regel geldt dat als de overlopende tekens allemaal spaties zijn, MySQL de overtollige spaties eenvoudigweg afkapt om in het veld te passen.
Het alternatief voor karaktervelden met een vaste lengte zijn velden met een variabele lengte. Hiervoor levert MySQL de varchar
type. De varchar
type slaat tekens op zonder vaste grootte. In tegenstelling tot char
, varchar
kan niet worden gebruikt zonder het maximum aantal op te slaan tekens op te geven.
Door een varchar
. te definiëren met een positief geheel getal kunt u een maximale tekenreekslengte instellen:
VARCHAR(10)
Dit verschilt van het gebruik van de char
typ met een geheel getal in dat varchar
zal de waarde niet opvullen als de invoer niet voldoet aan de maximale veldlengte:
Invoer | # invoertekens | Opgeslagen waarde | # opgeslagen tekens |
---|---|---|---|
'boom' | 4 | 'boom' | 4 |
Als de string groter is dan de maximale lengte, zal MySQL een foutmelding geven. Hetzelfde truncatiegedrag dat aanwezig is in char
velden komen hier voor:als de overlopende tekens spaties zijn, worden ze afgekapt zodat ze binnen de maximale tekenlengte passen.
MySQL ondersteunt ook de binary
en varbinary
gegevens typen. Deze werken op dezelfde manier als de char
en varchar
typen, maar sla binaire tekenreeksen op in plaats van tekenreeksen. Dit heeft gevolgen voor de manier waarop ze worden opgeslagen en gebruikt (voor zaken als vergelijkingen, sorteren, enz.).
Voor binary
en varbinary
typen, het gehele getal dat wordt gegeven bij het definiëren van het kolomtype vertegenwoordigt het aantal bytes in plaats van het aantal tekens.
Twee andere gegevenstypen die MySQL biedt voor strings en karakteropslag zijn blob
en text
. Deze typen werken vergelijkbaar met de varchar
en varbinary
respectievelijk en zijn bedoeld voor het opbergen van grote objecten. Ze werken grotendeels hetzelfde als hun tegenhangers, maar hebben een paar verschillen, zoals het niet kunnen hebben van standaardwaarden en het vereisen van een prefixlengte bij het maken van een index.
Booleans
MySQL heeft niet echt een native boolean type om ware en valse waarden weer te geven.
MySQL herkent de typen BOOL
of BOOLEAN
in een poging voor compatibiliteit met andere databasesystemen. De interne implementatie gebruikt echter een TINYINT(1)
kolom om de waarden op te slaan en interpreteert ze als waar of onwaar op basis van een reeks regels.
Bij het interpreteren van numerieke waarden in een booleaanse context, is de waarde van 0
wordt als vals beschouwd. Alle waarden die niet nul zijn, worden als waar beschouwd.
MySQL herkent de booleaanse letterlijke waarden TRUE
en FALSE
en converteert TRUE
naar 1 en FALSE
naar 0 wanneer u ze opslaat.
Datums en tijd
MySQL biedt ondersteuning voor het weergeven van datums, tijden en combinaties van beide.
Datums
De date
type kan een datum opslaan zonder een bijbehorende tijdwaarde:
DATE
Bij het verwerken van invoer voor date
kolommen, kan MySQL verschillende formaten interpreteren om de juiste opslagdatum te bepalen. De samenstellende delen moeten echter altijd in dezelfde volgorde komen:jaar, maand en dan dag. De STR_TO_DATE()
functie is beschikbaar om andere datumformaten te helpen converteren naar een formaat dat MySQL correct zal interpreteren.
Bij het weergeven van datums gebruikt MySQL de YYYY-MM-DD
formaat. U kunt de DATE_FORMAT()
. gebruiken functie om uitvoer in andere formaten te formatteren.
De date
type kan waarden opslaan variërend van 1000-01-01
tot 9999-12-31
.
Tijd
De time
gegevenstype kan een specifieke tijd van de dag opslaan zonder een bijbehorende tijdzone of datum.
Bij het verwerken van invoer gedurende time
kolommen, kan MySQL meerdere formaten interpreteren om de juiste opslagtijd te bepalen. Als invoer dubbele punten heeft, wordt dit over het algemeen geïnterpreteerd als hh:mm:ss
. Elke verkorte waarde (met slechts één kolom) wordt geïnterpreteerd als hh:mm
. Wanneer de invoer niet . doet dubbele punten hebben, wordt de tijd verwerkt om eerst de kleinste waarde op te vullen. Bijvoorbeeld 1045
duurt 10 minuten en 45 seconden.
MySQL ondersteunt ook fractionele seconden als er een decimaalteken wordt opgegeven. Het slaat tot 6 cijfers nauwkeurig op achter de komma. Waarden in time
kolommen kunnen variëren van -838:59:59.000000
naar 838:59:59.000000
.
Bij het weergeven van tijdwaarden gebruikt MySQL de hh:mm:ss
formaat. Net als bij datums is er een functie beschikbaar, genaamd TIME_FORMAT()
om tijdwaarden weer te geven met andere formaten.
Tijdstempels en datetime
MySQL kan tijdstempels vertegenwoordigen, een combinatie van een datum en tijd die wordt gebruikt om een specifiek moment in de tijd weer te geven, in twee verschillende variaties:met behulp van de timestamp
type en de datetime
typ.
De datetime
type kan waarden vertegenwoordigen van 1000-01-01 00:00:00
naar 9999-12-31 23:59:59
. Het kan ook fractionele seconden van maximaal zes cijfers bevatten, vergelijkbaar met de time
typ.
De timestamp
type kan waarden vertegenwoordigen van 1970-01-01 00:00:01
UTC naar 2038-01-19 03:14:07
UTC. Het kan ook fractionele seconden aan. Bij het opslaan van timestamp
waarden, worden alle waarden geconverteerd van de gegeven tijdzone naar UTC voor opslag en bij het ophalen weer geconverteerd naar de lokale tijdzone. De datetime
type doet dit niet.
Vanaf MySQL 8.0.19 kunt u een tijdzone-offset opnemen bij het opslaan van een timestamp
om de tijdzone voor de opgeslagen waarde expliciet in te stellen. U doet dit door een waarde op te nemen na de tijdcomponent, zonder spatie om de offset aan te geven. Het bereik van geaccepteerde waarden loopt van -14:00
tot +14:00
, die de offset van de opgeslagen waarde van UTC vertegenwoordigt.
Bij het beslissen of u datum- en tijdwaarden wilt opslaan met behulp van datetime
of timezone
soorten, is het vaak handig om ze te scheiden op basis van waar ze het beste voor zijn.
Denk aan datetime
waarden als een specifieke datum en tijd, in relatie tot de kalender en klok waar deze ook worden opgehaald. Als een persoon 's avonds om 23.00 uur naar bed gaat, wordt een datetime
waarde kan die waarde vertegenwoordigen, ongeacht in welke tijdzone de persoon zich momenteel bevindt.
Aan de andere kant, timezone
waarden zijn het beste in staat om een specifiek moment in de tijd weer te geven dat ondubbelzinnig is over tijdzones heen. Om een uitnodiging voor een videogesprek te sturen, een timezone
value zou ervoor kunnen zorgen dat de vergadering voor iedereen op hetzelfde tijdstip plaatsvindt, ongeacht in welke tijdzone de deelnemer zich bevindt.
Andere nuttige typen
Naast de typen die we hierboven met enige diepte hebben behandeld, zijn er aanvullende typen die nuttig zijn in specifieke scenario's. We zullen deze kort bespreken om u een idee te geven van hoe u ze kunt gebruiken en wanneer ze nuttig kunnen zijn.
Opsomming en set-types
Twee verwante typen waarmee gebruikers de geldige waarden voor een kolom kunnen dicteren, zijn de enum
en set
soorten.
De enum
type is een tekenreekstype waarmee de gebruiker een verzameling geldige waarden kan definiëren wanneer de kolom wordt gemaakt. Elke waarde die overeenkomt met een van de gedefinieerde waarden wordt geaccepteerd en alle andere waarden worden afgewezen. Dit werkt vergelijkbaar met een vervolgkeuzemenu, waarbij een keuze kan worden gemaakt uit een specifieke set opties. Bijvoorbeeld een enum
genaamd season
kan worden gemaakt met de waarden winter
, spring
, summer
, en autumn
.
Een enum
maken kolom, specificeer het type als enum
, waarbij de mogelijke waarden worden gegeven als strings, gescheiden door komma's, tussen haakjes, als volgt:
season ENUM('winter', 'spring', 'summer', 'autumn')
Een soortgelijk type door de gebruiker gedefinieerd type is de set
type. Zoals de enum
type, set
typen stellen gebruikers in staat om geldige waarden op te geven als tekenreeksen bij definitie. Het verschil tussen deze twee typen is dat in een set
, er kan voor elk record meer dan één waarde worden opgeslagen.
Als u bijvoorbeeld een kolom nodig had om de dagen van de week weer te geven waarop vrijwilligers beschikbaar zijn om te werken, zou u een set
kunnen hebben kolom als volgt:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
Bij het invoeren van waarden voor de availability
kolom die we zojuist hebben gemaakt, geeft u een enkele tekenreeks op met komma's die alle dagen scheiden dat de vrijwilliger beschikbaar is. Bijvoorbeeld:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
Voor set
typen in MySQL, dubbele waarden in invoer worden altijd verwijderd en bij het ophalen volgen de waarden de volgorde die wordt gebruikt in de set
definitie ongeacht de volgorde bij invoer in de kolom.
JSON
MySQL ondersteunt kolommen in JSON met behulp van de json
type. Gegevens opgeslagen als json
wordt binair opgeslagen voor snellere uitvoering en verwerking, zodat de server geen tekenreeks hoeft te interpreteren om op JSON
te werken waarden.
JSON
Werken op JSON
kolommen, biedt MySQL een aantal functies om met waarden in het document te werken.
Conclusie
In dit artikel hebben we veel van de meest voorkomende gegevenstypen behandeld die handig zijn bij het werken met MySQL-databases. Er zijn nog meer typen die niet in deze handleiding worden behandeld en die handig zijn om te weten, maar deze vormen een goed startpunt voor de meeste gebruikssituaties.
Het is belangrijk om het typesysteem op de juiste manier te gebruiken, zodat u geldige waarden kunt controleren en gegevens kunt gebruiken zoals verwacht. Er zijn valkuilen waar u tegenaan kunt lopen als u een type kiest dat niet geschikt is voor uw gegevens, dus in de meeste gevallen is het de moeite waard om erover na te denken voordat u zich tot een gegevenstype verbindt.
Als u Prisma Client gebruikt om met uw MySQL-databases te werken, kunt u een toewijzing vinden tussen enkele van de algemene MySQL- en Prisma-typen in de MySQL-gegevensconnectordocumenten van Prisma.