sql >> Database >  >> RDS >> Mysql

Een inleiding tot MySQL-gegevenstypen


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.




  1. Een weergave coderen in SQL Server

  2. GET_FORMAT() Voorbeelden – MySQL

  3. Gemiste optimalisaties omzeilen

  4. Hoe de invariante cultuur te specificeren bij het gebruik van FORMAT() in SQL Server