Beheers SQL-gegevenstypen in MySQL, PostgreSQL & SQL Server. Leer het juiste numerieke, tekst- en datumformaat kiezen om prestaties en datakwaliteit te optimaliseren.
Als je net begint met SQL, is het verleidelijk om gegevenstypen te zien als simpele labels. Een kolom slaat óf getallen, óf tekst, óf datums, óf speciale typen op. Maar een gegevenstype is meer dan een label. Het is een set regels die bepaalt wat een waarde in de ogen van de database is.
In de praktijk bepalen gegevenstypen hoe SQL de informatie in je database “begrijpt”. Het is een set instructies die SQL de context geeft om je data correct te lezen, vergelijken en verwerken.
In deze tutorial bekijken we de belangrijkste categorieën van SQL-gegevenstypen en hoe ze zich gedragen in verschillende databasebeheersystemen. Ik moedig je aan om de voorbeelden mee te volgen.
Als je nog niet veel met databasetabellen hebt gewerkt, geeft onzeSQL Fundamentals-cursus je een heldere, toegankelijke basis om te begrijpen hoe dit soort datasets zijn opgebouwd.
Wat zijn SQL-gegevenstypen?
Een gegevenstype beschrijft het formaat van je data: welke waarden een kolom kan bevatten, hoe die waarden intern worden opgeslagen en welke bewerkingen er logisch op zijn.
Je keuze van gegevenstype beïnvloedt dus meer dan alleen het tabelontwerp. Het kan invloed hebben op opslagbehoefte, queryprestaties, sorteergedrag, rekenkundige bewerkingen en zelfs hoe verschillende systemen dezelfde waarde interpreteren.
Hier is een eenvoudige tabel die meerdere typen tegelijk gebruikt:
CREATETABLE employees (
id INT,
name VARCHAR(50),
start_date DATE,
active BOOLEAN,
salary DECIMAL(10,2));Mogelijk gemaakt door
Elke kolom in deze tabel bepaalt welk type data die kan bevatten.
De kolom id slaat gehele getallen op en geeft elke medewerker een uniek ID.
De kolom name kan tot 50 tekens tekst bevatten, dus geschikt voor korte namen.
De kolom start_date is voor kalenderdatums.
De kolom active slaat true/false-waarden op, zodat je eenvoudig ziet welke medewerkers momenteel actief zijn.
Tot slot slaat de kolom salary geldbedragen op met een precisie van 10 cijfers, waarvan twee na de decimale punt voor centen.
Samen vormen deze kolommen een gestructureerde tabel die regels afdwingt over welke waarden in elk veld zijn toegestaan. Dat maakt de data voorspelbaarder en makkelijker om mee te werken.
Laten we hier voorbeelddata aan toevoegen en kijken hoe de resulterende tabel eruit kan zien in PostgreSQL.
INSERTINTO employees (id, name, start_date, active, salary)VALUES(1,'Alice Johnson','2025-01-15',TRUE,55000.00),(2,'Bob Smith','2024-06-01',FALSE,62000.50);SELECT*FROM employees;Mogelijk gemaakt door
id
name
start_date
active
salary
1
Alice Johnson
2025-01-15
TRUE
55000.00
2
Bob Smith
2024-06-01
FALSE
62000.50
Verschillende databasesystemen volgen dezelfde principes, maar verschillen in naamgeving en features. Zo gebruikt SQL Server BIT in plaats van BOOLEAN, en behandelt MySQL BOOLEAN als een klein geheel getal.
Categorieën van SQL-gegevenstypen
Er zijn vier hoofdcategorieën: numeriek, tekenreeks, datum/tijd en speciaal. Laten we ze stuk voor stuk bekijken.
Numerieke gegevenstypen
Numerieke typen slaan gehele getallen of decimalen op. Het specifieke type bepaalt het bereik, de precisie en de opslaggrootte van de waarden. De meest gebruikte typen zijn:
gehele getallen, zoals INT, SMALLINT en BIGINT, voor integers,
decimalen, zoals DECIMAL(p, s) en NUMERIC(p, s), voor exacte decimale waarden,
en floats, zoals FLOAT en DOUBLE, voor benaderende waarden die kleine afrondingsverschillen kunnen introduceren
Laten we een voorbeeldtabel maken om verschillende numerieke typen te demonstreren:
CREATETABLE products (
product_id INT,
price DECIMAL(8,2),
measurement FLOAT);INSERTINTO products VALUES(1,19.99,3.1415),(2,250.56,2.71828);SELECT*FROM products;Mogelijk gemaakt door
Zo ziet de uitvoer er uit in tabelvorm:
product_id
price
measurement
1
19.99
3.1415
2
250.56
2.71828
Zoals je ziet, is de eerste kolom beperkt tot een geheel getal, de tweede tot een decimaal met twee cijfers na de komma en de derde is een drijvende komma met een onbepaald aantal cijfers.
Op het eerste gezicht lijken DECIMAL en FLOAT hetzelfde. Maar er is een belangrijk verschil: DECIMAL slaat een exact getal op met een gespecificeerd aantal decimalen, terwijl FLOAT een benaderende waarde bewaart die per systeem licht kan verschillen.
Het is belangrijk om decimalen te gebruiken wanneer precisie nodig is en floats alleen te gebruiken als kleine afrondingsfouten acceptabel zijn.
Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Numeriek
INT, SMALLINT, BIGINT
Gehele getallen van uiteenlopende grootte
1, 42, 1000
Numeriek
DECIMAL(p,s), NUMERIC(p,s)
Exacte decimale waarden met vaste precisie
19.99, 250.56
Numeriek
FLOAT, DOUBLE
Benaderende decimale waarden; kan kleine afrondingsverschillen geven
3.1415, 2.71828
Teken- en stringtypen
Teken(keten)typen slaan tekst op. Er zijn verschillende varianten die verschillen in prestaties en opslagefficiëntie.
CHAR(n) is voor tekst met vaste lengte. Handig voor data die altijd even lang is, zoals staatcodes of luchthavenafkortingen.
VARCHAR(n) is voor tekst met variabele lengte. Handig voor namen, e-mailadressen en andere door gebruikers ingevoerde tekst.
TEXT en vergelijkbare typen zijn bedoeld voor grote blokken ongestructureerde tekst, zoals blogposts of productbeschrijvingen.
Sommige systemen, zoals SQL Server, ondersteunen zelfs Unicode-tekentypen, zoals NCHAR en NVARCHAR, die nuttig zijn wanneer je data tekst in meerdere schriftsystemen bevat, zoals Latijns, Chinees of Cyrillisch.
Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Teken / String
CHAR(n)
Tekst met vaste lengte
'US', 'CA'
Teken / String
VARCHAR(n)
Tekst met variabele lengte
'Alice Johnson', 'Bob Smith'
Teken / String
TEXT
Grote blokken ongestructureerde tekst
'Preferred contact by email.', 'Requires invoice copy for each order.'
Teken / String
NCHAR(n), NVARCHAR(n)
Unicode-tekst met vaste of variabele lengte
'Å', 'É', 'München', 'São Paulo'
Laten we kijken hoe dit eruitziet met een voorbeeldtabel die verschillende stringtypen demonstreert:
CREATETABLE customers (
id INT,
country_code CHAR(2),
name VARCHAR(100),
notes TEXT);INSERTINTO customers VALUES(1,'US','Alice Johnson','Preferred contact by email.'),(2,'CA','Bob Smith','Requires invoice copy for each order.');SELECT*FROM customers;Mogelijk gemaakt door
Zo zou deze tabel er uiteindelijk uitzien. Je ziet de lengteverschillen die in elk stringtype zijn vastgelegd.
id
country_code
name
notes
1
US
Alice Johnson
Preferred contact by email.
2
CA
Bob Smith
Requires invoice copy for each order.
Hier zie je dat CHAR(2) een consistente lengte afdwingt, terwijl VARCHAR en TEXT meer flexibiliteit bieden.
Datum- en tijdtypen
Datum- en tijdtypen maken het mogelijk om temporele informatie nauwkeurig op te slaan en te bevragen. Beginners denken soms dat je dit ook met numerieke of stringtypen kunt coderen. Maar dat kan later problemen veroorzaken bij data-analyse. Met specifieke kalendertypen verloopt alles soepeler.
De drie meest gebruikte typen zijn:
DATE, dat jaar, maand en dag codeert,
TIME, dat uur, minuut en seconde opslaat,
en DATETIME of TIMESTAMP, die datum en tijd combineren.
Moderne databases ondersteunen zelfs fracties van seconden of tijdzone-bewuste typen, zoals TIMESTAMPTZ in PostgreSQL, dat tijdstempels in UTC opslaat en ze bij het ophalen automatisch converteert naar de tijdzone van je sessie.
Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Datum / Tijd
DATE
Kalenderdatums (jaar, maand, dag)
'2025-11-26'
Datum / Tijd
TIME
Tijd van de dag (uur, minuut, seconde)
'09:30:00', '18:45:30'
Datum / Tijd
DATETIME, TIMESTAMP
Gecombineerde datum en tijd
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Datum / Tijd
TIMESTAMPTZ
Gecombineerde datum en tijd met tijdzone (PostgreSQL)
'2025-11-21 09:00:00+00'
Laten we een eenvoudige tabel maken om deze temporele typen te demonstreren:
CREATETABLE events (
event_id INT,
event_date DATE,
start_time TIME,
created_at DATETIME);INSERTINTO events VALUES(1,'2025-11-26','09:30:00','2025-11-20 14:15:00'),(2,'2025-12-01','18:45:30','2025-11-21 09:00:00');SELECT*FROM events;Mogelijk gemaakt door
Zo zou de tabel eruitzien:
event_id
event_date
start_time
created_at
1
2025-11-26
09:30:00
2025-11-20 14:15:00
2
2025-12-01
18:45:30
2025-11-21 09:00:00
Je ziet hoe de keuze voor het juiste datum- of tijdstempeltype bepaalt welk soort gegevens je kunt opslaan.
Booleans en andere speciale typen
Niet alle data past netjes in een van de vorige categorieën. Daarvoor bevat SQL speciale typen voor specifieke use-cases. Veelvoorkomende voorbeelden zijn:
Booleaanse waarden (BOOLEAN, BOOL of BIT, afhankelijk van het systeem) om true/false vast te leggen,
Binaire data (BLOB) voor afbeeldingen, bestanden of geserialiseerde objecten,
Grote tekst (CLOB) voor volledige documenten,
JSON (in MySQL en PostgreSQL) voor schemaloze of geneste data
ARRAY (alleen in PostgreSQL) voor lijsten
UUID voor unieke ID’s die niet op numerieke reeksen steunen, zoals een sessietoken of globale trackingcode.
Speciale typen laten je rijkere of flexibelere data opslaan wanneer traditionele tabellen de structuur niet volledig vangen.
Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Speciaal / Boolean / Overig
BOOLEAN, BOOL, BIT
True- of false-waarden
TRUE, FALSE
Speciaal / Boolean / Overig
BLOB
Binaire grote objecten (afbeeldingen, bestanden)
[binary image data]
Speciaal / Boolean / Overig
CLOB
Grote tekstdocumenten
'Full contract text...'
Speciaal / Boolean / Overig
JSON
Gestructureerde of geneste data
'{"name": "Alice"}'
Speciaal / Boolean / Overig
ARRAY
Lijsten met waarden (alleen PostgreSQL)
[1,2,3]
Speciaal / Boolean / Overig
UUID
Wereldwijd unieke identifiers
'550e8400-e29b-41d4-a716-446655440000'
SQL-gegevenstypen in verschillende systemen
Databasebeheersystemen verschillen in details van hoe ze deze typen gebruiken. Hoewel de brede categorieën gelijk blijven, variëren de exacte namen en eigenschappen per systeem.
Elk systeem ontwerpt zijn gegevenstypen met eigen prioriteiten, wat hun gedrag verklaart. Soms zijn de verschillen klein, zoals het gebruikte trefwoord. Andere keren verandert het gedrag merkbaar, zoals limieten op tekstlengte, hoe booleans worden opgeslagen of of het systeem gespecialiseerde formaten ondersteunt.
MySQL benadrukt snelheid en eenvoud en gebruikt daarom praktische, lichte keuzes zoals TINYINT (technisch als getallen opgeslagen) voor booleans. Het geeft prioriteit aan prestaties en brede compatibiliteit boven strikte typesemantiek.
PostgreSQL streeft naar standaardconformiteit en uitbreidbaarheid. Dat zie je terug in het gebruik van een echt BOOLEAN-type en een rijkere set opties, zoals ARRAY en JSONB om gestructureerde of geneste data direct in een kolom op te slaan.
SQL Server is gericht op voorspelbare prestaties in enterprise-omgevingen en diepe integratie met Microsoft’s ecosysteem. Daarom biedt het sterk gedefinieerde typen zoals BIT voor booleans en VARCHAR(MAX) voor grote tekst.
De onderstaande tabel geeft een vergelijking van hoe drie grote SQL-systemen veelvoorkomende concepten implementeren.
Concept
MySQL
PostgreSQL
SQL Server
Numeriek (gehele getallen)
Gebruikt INT voor algemene integers
Gebruikt INTEGER voor gehele getallen
Gebruikt INT voor gehele getallen
Decimaal / vaste precisie
Gebruikt DECIMAL(p, s) voor precieze numerieke waarden
Gebruikt NUMERIC(p, s) voor exacte precisie-opslag
Gebruikt DECIMAL(p, s) voor precieze numerieke waarden
Tekststrings van standaardlengte
Gebruikt VARCHAR(n) voor variabele-lengte tekst
Gebruikt VARCHAR(n) voor variabele-lengte tekst
Gebruikt VARCHAR(n) voor variabele-lengte tekst
Grote tekstopslag
Gebruikt TEXT voor lange tekstvelden
Gebruikt TEXT voor lange tekstvelden
Gebruikt VARCHAR(MAX) voor lange tekstvelden
Booleaanse waarden
Slaat booleans op als TINYINT(1) (0 of 1)
Gebruikt native BOOLEAN-waarden (true/false)
Gebruikt BIT (0 of 1) voor boolean-achtige data
Auto-increment primaire sleutels
Gebruikt het trefwoord AUTO_INCREMENT
Gebruikt SERIAL of IDENTITY voor autogegenereerde integers
Gebruikt IDENTITY voor autogegenereerde integers
Zeer grote tekenreeksen
Gebruikt LONGTEXT voor extreem grote tekst
Staat zeer grote VARCHAR toe zonder praktisch bovengrens
Gebruikt VARCHAR(MAX) voor grote of onbegrensde tekst
JSON-opslag
Ondersteunt JSON voor gestructureerde JSON-data
Ondersteunt zowel JSON (tekst) als JSONB (binair geoptimaliseerd)
Ondersteunt JSON (opgeslagen als tekst)
Array-opslag
Ondersteunt geen arraytypen
Ondersteunt ARRAY om lijsten in één kolom op te slaan
Ondersteunt geen arraytypen
Wat dit in de praktijk betekent
De achterliggende ontwerpdoelen en de workloads waarvoor systemen zijn geoptimaliseerd, beïnvloeden direct hoe ze werken.
Deze verschillen betekenen dat veel SQL-vaardigheden goed overdraagbaar zijn, maar details zoals maximale tekstgrootte, auto-increment-trefwoorden of ondersteuning voor complexe structuren kunnen variëren.
Als je slechts één systeem gebruikt, word je al snel expert in de bijzonderheden ervan. Maar een nieuwe baan of afdeling kan vereisen dat je in een ander DBMS met andere regels duikt.
Daarom is het bij het leren van SQL handig om de gedeelde concepten achter gegevenstypen te herkennen in plaats van alleen te vertrouwen op de details van één systeem.
Het juiste gegevenstype kiezen
Een gegevenstype kiezen is soms eenvoudig, maar soms vergt het wat denkwerk. Een goede keuze maakt je data makkelijker te bevragen, houdt de opslag compact en voorkomt bugs verderop. De hoofdcategorie wordt meestal bepaald door het soort data dat je hebt.
Numerieke data
Stel dat je meetgegevens opslaat. Dan wil je uiteraard een numeriek type, geen kalender- of stringtype. Maar hoe precies wil je meten? Zijn gehele getallen oké, of heb je decimalen nodig? Wil je een vast aantal significante cijfers?
Denk vervolgens aan opslag en efficiëntie. Kies het kleinste integertype dat je data veilig kan bevatten om je tabellen efficiënt te houden. Kleinere typen gebruiken minder opslag en kunnen prestaties verbeteren, zeker bij grote tabellen. Meestal kies je een type dat groot genoeg is voor je verwachte bereik zonder ver daarboven te gaan.
Als een integer niet volstaat, kies je tussen DECIMAL en FLOAT. Floating-point-typen benaderen waarden in plaats van ze exact op te slaan, wat afrondingsfouten kan veroorzaken in financiële, wetenschappelijke of andere nauwkeurige toepassingen.
DECIMAL en NUMERIC slaan exacte waarden op en zijn beter voor alles met prijzen of ratio’s. Wel hebben DECIMALs doorgaans meer opslag nodig dan FLOATs, afhankelijk van het aantal decimalen dat je bewaart.
Teken- en stringdata
Voor strings denk je na over hoe groot elke invoer mag zijn.
Meestal geef je VARCHAR-velden een realistische lengte in plaats van standaard de maximumlengte. Te ruime limieten vergroten zelden de flexibiliteit en kunnen toekomstige ontwikkelaars misleiden over de verwachte grootte van de data.
Denk aan je verwachte input—namen, e-mails, producttitels—en kies de kolomlengte dienovereenkomstig.
Datum- en tijddata
Wees precies over wat je bij kalenderdata opslaat.
Als je alleen een datum of alleen een tijd nodig hebt, gebruik dan liever DATE of TIME dan DATETIME. Dat maakt je intenties duidelijker en verkleint de kans op verwarring later. Het geeft de database ook iets meer ruimte om date-only of time-only queries te optimaliseren.
Booleaanse data
Gebruik waar mogelijk domeinspecifieke typen zoals BOOLEAN in plaats van omwegen zoals integers of strings. Native typen bieden ingebouwde validatie, duidelijkere semantiek en ondersteuning door databasefuncties die specifieke datatypen verwachten.
Hieronder staat een samenvatting van veelvoorkomende opslagdoelen en de aanbevolen SQL-typen om die aan te pakken.
Doel
Aanbevolen gegevenstype
Waarom
Exacte numerieke waarden opslaan (geld, metingen)
DECIMAL of NUMERIC
Slaat precieze waarden op zonder floating-point afrondingsproblemen
Korte of middellange tekst opslaan
VARCHAR(n)
Efficiënte opslag met voorspelbare grootte en flexibele lengte
Lange, ongestructureerde tekst opslaan
TEXT of CLOB
Ontworpen voor tekstblokken zoals beschrijvingen of documenten
Alleen datum- of alleen tijdinformatie opslaan
DATE of TIME
Vermijdt onnodige complexiteit en weerspiegelt de werkelijke betekenis
Flexibele, documentachtige waarden opslaan
JSON of JSONB
Handig voor geneste of evoluerende structuren die niet in vaste kolommen passen
Voor lezers die hun kennis over groeperen en filteren willen opfrissen: deIntermediate SQL-cursus behandelt die kernvaardigheden.
Veelvoorkomende valkuilen en best practices
Zelfs een eenvoudig databaseschema kan problemen krijgen als gegevenstypen niet zorgvuldig zijn gekozen.
Afkapping
Als je bijvoorbeeld een kolom voor namen hebt die slechts 5 tekens toelaat, eindig je met “Micha” in plaats van “Michael”. Dit is een veelvoorkomend probleem, bekend als afkapping (truncation).
Het duikt vaak op in velden zoals namen, adressen of opmerkingen, waar variatie in de echte wereld een te optimistische limiet overstijgt. Voorkom dit door tekstvelden te dimensioneren op basis van echte voorbeelden of kies iets ruimer.
Afrondingsfouten
Een andere valkuil is onverwachte afronding wanneer floating-pointwaarden worden gebruikt voor geld of andere precieze data. Omdat FLOATs benaderingen opslaan, kunnen kleine afwijkingen zich opstapelen en rapportages of berekeningen beïnvloeden.
Kies voor alles met valuta of exacte decimalen DECIMAL. Zo blijven de getallen stabiel.
Type-mismatches
Type-mismatches kunnen ook trage queries veroorzaken, vooral bij joins of vergelijkingen.
Als een kolom als string is opgeslagen en een andere als integer (of elk een iets ander type gebruikt) en je probeert te joinen, moet de database mogelijk on-the-fly converteren. Dat kan fouten geven en onnodige overhead toevoegen.
Door gerelateerde kolommen op elkaar af te stemmen qua type vermijd je deze verborgen conversies en lopen queries soepeler.
Datumopmaak
Kalenderdata heeft zijn eigen uitdagingen.
Inconsistenties in datumopmaak zijn een belangrijke bron van verwarring wanneer systemen lokale conventies mixen of wanneer ontwikkelaars datums als strings opslaan in plaats van met echte datumtypen. Dat kan queries in de war brengen of onjuiste resultaten opleveren.
De eenvoudige oplossing is om daadwerkelijke datumtypen te gebruiken en, wanneer je met tekst werkt, een consequente, eenduidige notatie aan te houden. Ik beveel onze Time Series Analysis in SQL Server-cursus aan om de meest voorkomende kalenderproblemen in je databases te vermijden.
Best practices
Enkele best practices om je databases soepel te laten draaien:
Vul tabellen vroeg in het ontwerpproces met voorbeelddata om zwaktes in grootte- of typekeuzes te ontdekken.
Documenteer het doel en het verwachte bereik van elke kolom, zodat toekomstige wijzigingen geen mismatches introduceren.
Vermijd generieke typen als specifiekere typen de duidelijkheid vergroten.
Conclusie
Gegevenstypen bepalen hoe je database de waarden “begrijpt” die je opslaat. Ze beïnvloeden alles van opslag en prestaties tot duidelijkheid. Door te begrijpen hoe ze werken, maak je je databases betrouwbaarder en voorspelbaarder.
Een gegevenstype in SQL definieert welk soort data een kolom kan opslaan en hoe die data zich gedraagt bij bevragen of verwerken. Het beïnvloedt opslag, validatie, sorteren, vergelijken en rekenkundige bewerkingen.
SQL-gegevenstypen FAQ
Wat is een gegevenstype in SQL?⌄
Een gegevenstype in SQL is een set regels die SQL vertelt welk soort informatie het in je databasekolom kan verwachten. Het is in wezen hoe je systeem je data “begrijpt”.
Hoe stel ik een kolom in op een specifiek gegevenstype in SQL?⌄
Wanneer je een kolom in SQL definieert, geef je het gegevenstype direct na de kolomnaam op. Dat ziet er zo uit: name DATATYPE. Je kunt ook het commando ALTER COLUMN gebruiken om het gegevenstype te wijzigen in een kolom die je al hebt gedefinieerd.
Waarom moet ik het juiste gegevenstype kiezen?⌄
Door het juiste gegevenstype voor je data te kiezen, maak je duidelijk welk soort data je hebt, zorg je voor correcte opslag en gebruik en voorkom je bugs verderop in je code.
Wat is het verschil tussen een DECIMAL en een FLOAT?⌄
Een DECIMAL is een precies numeriek type dat het getal opslaat met een vast aantal decimalen. Een FLOAT daarentegen slaat een benadering van het getal op.
Gebruiken alle databasebeheersystemen dezelfde gegevenstypen?⌄
Ja en nee. Elk databasebeheersysteem heeft vergelijkbare typen voor numerieke, teken- en kalenderdata. Maar ze verschillen in hun specifieke namen, hoe ze onder de motorkap werken en welke speciale typen ze ondersteunen.
Ik ben gepromoveerd en heb 13 jaar ervaring met het werken met data in een biologische onderzoeksomgeving. Ik maak software in verschillende programmeertalen, waaronder Python, MATLAB en R. Ik deel met plezier mijn liefde voor leren met de wereld.
Leer de basis van SQL die je nodig hebt voor je werk, ontdek hoe je SQL-query's schrijft en begin met het analyseren van je data met deze handige taal.
Als je net begint met SQL, is het verleidelijk om gegevenstypen te zien als simpele labels. Een kolom slaat óf getallen, óf tekst, óf datums, óf speciale typen op. Maar een gegevenstype is meer dan een label. Het is een set regels die bepaalt wat een waarde in de ogen van de database is.
In de praktijk bepalen gegevenstypen hoe SQL de informatie in je database “begrijpt”. Het is een set instructies die SQL de context geeft om je data correct te lezen, vergelijken en verwerken.
In deze tutorial bekijken we de belangrijkste categorieën van SQL-gegevenstypen en hoe ze zich gedragen in verschillende databasebeheersystemen. Ik moedig je aan om de voorbeelden mee te volgen.
Als je nog niet veel met databasetabellen hebt gewerkt, geeft onze SQL Fundamentals-cursus je een heldere, toegankelijke basis om te begrijpen hoe dit soort datasets zijn opgebouwd.
Wat zijn SQL-gegevenstypen?
Een gegevenstype beschrijft het formaat van je data: welke waarden een kolom kan bevatten, hoe die waarden intern worden opgeslagen en welke bewerkingen er logisch op zijn.
Je keuze van gegevenstype beïnvloedt dus meer dan alleen het tabelontwerp. Het kan invloed hebben op opslagbehoefte, queryprestaties, sorteergedrag, rekenkundige bewerkingen en zelfs hoe verschillende systemen dezelfde waarde interpreteren.
Hier is een eenvoudige tabel die meerdere typen tegelijk gebruikt:
Elke kolom in deze tabel bepaalt welk type data die kan bevatten.
De kolom
idslaat gehele getallen op en geeft elke medewerker een uniek ID.De kolom
namekan tot 50 tekens tekst bevatten, dus geschikt voor korte namen.De kolom
start_dateis voor kalenderdatums.De kolom
activeslaat true/false-waarden op, zodat je eenvoudig ziet welke medewerkers momenteel actief zijn.Tot slot slaat de kolom
salarygeldbedragen op met een precisie van 10 cijfers, waarvan twee na de decimale punt voor centen.Samen vormen deze kolommen een gestructureerde tabel die regels afdwingt over welke waarden in elk veld zijn toegestaan. Dat maakt de data voorspelbaarder en makkelijker om mee te werken.
Laten we hier voorbeelddata aan toevoegen en kijken hoe de resulterende tabel eruit kan zien in PostgreSQL.
id
name
start_date
active
salary
1
Alice Johnson
2025-01-15
TRUE
55000.00
2
Bob Smith
2024-06-01
FALSE
62000.50
Verschillende databasesystemen volgen dezelfde principes, maar verschillen in naamgeving en features. Zo gebruikt SQL Server
BITin plaats vanBOOLEAN, en behandelt MySQLBOOLEANals een klein geheel getal.Categorieën van SQL-gegevenstypen
Er zijn vier hoofdcategorieën: numeriek, tekenreeks, datum/tijd en speciaal. Laten we ze stuk voor stuk bekijken.
Numerieke gegevenstypen
Numerieke typen slaan gehele getallen of decimalen op. Het specifieke type bepaalt het bereik, de precisie en de opslaggrootte van de waarden. De meest gebruikte typen zijn:
gehele getallen, zoals
INT,SMALLINTenBIGINT, voor integers,decimalen, zoals
DECIMAL(p, s)enNUMERIC(p, s), voor exacte decimale waarden,en floats, zoals
FLOATenDOUBLE, voor benaderende waarden die kleine afrondingsverschillen kunnen introducerenLaten we een voorbeeldtabel maken om verschillende numerieke typen te demonstreren:
Zo ziet de uitvoer er uit in tabelvorm:
product_id
price
measurement
1
19.99
3.1415
2
250.56
2.71828
Zoals je ziet, is de eerste kolom beperkt tot een geheel getal, de tweede tot een decimaal met twee cijfers na de komma en de derde is een drijvende komma met een onbepaald aantal cijfers.
Op het eerste gezicht lijken
DECIMALenFLOAThetzelfde. Maar er is een belangrijk verschil:DECIMALslaat een exact getal op met een gespecificeerd aantal decimalen, terwijlFLOATeen benaderende waarde bewaart die per systeem licht kan verschillen.Het is belangrijk om decimalen te gebruiken wanneer precisie nodig is en floats alleen te gebruiken als kleine afrondingsfouten acceptabel zijn.
Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Numeriek
INT,SMALLINT,BIGINTGehele getallen van uiteenlopende grootte
1, 42, 1000
Numeriek
DECIMAL(p,s),NUMERIC(p,s)Exacte decimale waarden met vaste precisie
19.99, 250.56
Numeriek
FLOAT,DOUBLEBenaderende decimale waarden; kan kleine afrondingsverschillen geven
3.1415, 2.71828
Teken- en stringtypen
Teken(keten)typen slaan tekst op. Er zijn verschillende varianten die verschillen in prestaties en opslagefficiëntie.
CHAR(n)is voor tekst met vaste lengte. Handig voor data die altijd even lang is, zoals staatcodes of luchthavenafkortingen.VARCHAR(n)is voor tekst met variabele lengte. Handig voor namen, e-mailadressen en andere door gebruikers ingevoerde tekst.TEXTen vergelijkbare typen zijn bedoeld voor grote blokken ongestructureerde tekst, zoals blogposts of productbeschrijvingen.Sommige systemen, zoals SQL Server, ondersteunen zelfs Unicode-tekentypen, zoals
NCHARenNVARCHAR, die nuttig zijn wanneer je data tekst in meerdere schriftsystemen bevat, zoals Latijns, Chinees of Cyrillisch.Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Teken / String
CHAR(n)Tekst met vaste lengte
'US', 'CA'
Teken / String
VARCHAR(n)Tekst met variabele lengte
'Alice Johnson', 'Bob Smith'
Teken / String
TEXTGrote blokken ongestructureerde tekst
'Preferred contact by email.', 'Requires invoice copy for each order.'
Teken / String
NCHAR(n),NVARCHAR(n)Unicode-tekst met vaste of variabele lengte
'Å', 'É', 'München', 'São Paulo'
Laten we kijken hoe dit eruitziet met een voorbeeldtabel die verschillende stringtypen demonstreert:
Zo zou deze tabel er uiteindelijk uitzien. Je ziet de lengteverschillen die in elk stringtype zijn vastgelegd.
id
country_code
name
notes
1
US
Alice Johnson
Preferred contact by email.
2
CA
Bob Smith
Requires invoice copy for each order.
Hier zie je dat
CHAR(2)een consistente lengte afdwingt, terwijlVARCHARenTEXTmeer flexibiliteit bieden.Datum- en tijdtypen
Datum- en tijdtypen maken het mogelijk om temporele informatie nauwkeurig op te slaan en te bevragen. Beginners denken soms dat je dit ook met numerieke of stringtypen kunt coderen. Maar dat kan later problemen veroorzaken bij data-analyse. Met specifieke kalendertypen verloopt alles soepeler.
De drie meest gebruikte typen zijn:
DATE, dat jaar, maand en dag codeert,TIME, dat uur, minuut en seconde opslaat,en
DATETIMEofTIMESTAMP, die datum en tijd combineren.Moderne databases ondersteunen zelfs fracties van seconden of tijdzone-bewuste typen, zoals
TIMESTAMPTZin PostgreSQL, dat tijdstempels in UTC opslaat en ze bij het ophalen automatisch converteert naar de tijdzone van je sessie.Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Datum / Tijd
DATEKalenderdatums (jaar, maand, dag)
'2025-11-26'
Datum / Tijd
TIMETijd van de dag (uur, minuut, seconde)
'09:30:00', '18:45:30'
Datum / Tijd
DATETIME,TIMESTAMPGecombineerde datum en tijd
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Datum / Tijd
TIMESTAMPTZGecombineerde datum en tijd met tijdzone (PostgreSQL)
'2025-11-21 09:00:00+00'
Laten we een eenvoudige tabel maken om deze temporele typen te demonstreren:
Zo zou de tabel eruitzien:
event_id
event_date
start_time
created_at
1
2025-11-26
09:30:00
2025-11-20 14:15:00
2
2025-12-01
18:45:30
2025-11-21 09:00:00
Je ziet hoe de keuze voor het juiste datum- of tijdstempeltype bepaalt welk soort gegevens je kunt opslaan.
Booleans en andere speciale typen
Niet alle data past netjes in een van de vorige categorieën. Daarvoor bevat SQL speciale typen voor specifieke use-cases. Veelvoorkomende voorbeelden zijn:
Booleaanse waarden (
BOOLEAN,BOOLofBIT, afhankelijk van het systeem) om true/false vast te leggen,Binaire data (
BLOB) voor afbeeldingen, bestanden of geserialiseerde objecten,Grote tekst (
CLOB) voor volledige documenten,JSON(in MySQL en PostgreSQL) voor schemaloze of geneste dataARRAY(alleen in PostgreSQL) voor lijstenUUIDvoor unieke ID’s die niet op numerieke reeksen steunen, zoals een sessietoken of globale trackingcode.Speciale typen laten je rijkere of flexibelere data opslaan wanneer traditionele tabellen de structuur niet volledig vangen.
Categorie
Gegevenstype(n)
Doel / Wat het opslaat
Voorbeeldwaarde(n)
Speciaal / Boolean / Overig
BOOLEAN,BOOL,BITTrue- of false-waarden
TRUE, FALSE
Speciaal / Boolean / Overig
BLOBBinaire grote objecten (afbeeldingen, bestanden)
[binary image data]
Speciaal / Boolean / Overig
CLOBGrote tekstdocumenten
'Full contract text...'
Speciaal / Boolean / Overig
JSONGestructureerde of geneste data
'{"name": "Alice"}'
Speciaal / Boolean / Overig
ARRAYLijsten met waarden (alleen PostgreSQL)
[1,2,3]
Speciaal / Boolean / Overig
UUIDWereldwijd unieke identifiers
'550e8400-e29b-41d4-a716-446655440000'
SQL-gegevenstypen in verschillende systemen
Databasebeheersystemen verschillen in details van hoe ze deze typen gebruiken. Hoewel de brede categorieën gelijk blijven, variëren de exacte namen en eigenschappen per systeem.
Elk systeem ontwerpt zijn gegevenstypen met eigen prioriteiten, wat hun gedrag verklaart. Soms zijn de verschillen klein, zoals het gebruikte trefwoord. Andere keren verandert het gedrag merkbaar, zoals limieten op tekstlengte, hoe booleans worden opgeslagen of of het systeem gespecialiseerde formaten ondersteunt.
MySQL benadrukt snelheid en eenvoud en gebruikt daarom praktische, lichte keuzes zoals
TINYINT(technisch als getallen opgeslagen) voor booleans. Het geeft prioriteit aan prestaties en brede compatibiliteit boven strikte typesemantiek.PostgreSQL streeft naar standaardconformiteit en uitbreidbaarheid. Dat zie je terug in het gebruik van een echt
BOOLEAN-type en een rijkere set opties, zoalsARRAYenJSONBom gestructureerde of geneste data direct in een kolom op te slaan.SQL Server is gericht op voorspelbare prestaties in enterprise-omgevingen en diepe integratie met Microsoft’s ecosysteem. Daarom biedt het sterk gedefinieerde typen zoals
BITvoor booleans enVARCHAR(MAX)voor grote tekst.De onderstaande tabel geeft een vergelijking van hoe drie grote SQL-systemen veelvoorkomende concepten implementeren.
Concept
MySQL
PostgreSQL
SQL Server
Numeriek (gehele getallen)
Gebruikt
INTvoor algemene integersGebruikt
INTEGERvoor gehele getallenGebruikt
INTvoor gehele getallenDecimaal / vaste precisie
Gebruikt
DECIMAL(p, s)voor precieze numerieke waardenGebruikt
NUMERIC(p, s)voor exacte precisie-opslagGebruikt
DECIMAL(p, s)voor precieze numerieke waardenTekststrings van standaardlengte
Gebruikt
VARCHAR(n)voor variabele-lengte tekstGebruikt
VARCHAR(n)voor variabele-lengte tekstGebruikt
VARCHAR(n)voor variabele-lengte tekstGrote tekstopslag
Gebruikt
TEXTvoor lange tekstveldenGebruikt
TEXTvoor lange tekstveldenGebruikt
VARCHAR(MAX)voor lange tekstveldenBooleaanse waarden
Slaat booleans op als
TINYINT(1)(0 of 1)Gebruikt native
BOOLEAN-waarden (true/false)Gebruikt
BIT(0 of 1) voor boolean-achtige dataAuto-increment primaire sleutels
Gebruikt het trefwoord
AUTO_INCREMENTGebruikt
SERIALofIDENTITYvoor autogegenereerde integersGebruikt
IDENTITYvoor autogegenereerde integersZeer grote tekenreeksen
Gebruikt
LONGTEXTvoor extreem grote tekstStaat zeer grote
VARCHARtoe zonder praktisch bovengrensGebruikt
VARCHAR(MAX)voor grote of onbegrensde tekstJSON-opslag
Ondersteunt
JSONvoor gestructureerde JSON-dataOndersteunt zowel
JSON(tekst) alsJSONB(binair geoptimaliseerd)Ondersteunt
JSON(opgeslagen als tekst)Array-opslag
Ondersteunt geen arraytypen
Ondersteunt
ARRAYom lijsten in één kolom op te slaanOndersteunt geen arraytypen
Wat dit in de praktijk betekent
De achterliggende ontwerpdoelen en de workloads waarvoor systemen zijn geoptimaliseerd, beïnvloeden direct hoe ze werken.
Deze verschillen betekenen dat veel SQL-vaardigheden goed overdraagbaar zijn, maar details zoals maximale tekstgrootte, auto-increment-trefwoorden of ondersteuning voor complexe structuren kunnen variëren.
Als je slechts één systeem gebruikt, word je al snel expert in de bijzonderheden ervan. Maar een nieuwe baan of afdeling kan vereisen dat je in een ander DBMS met andere regels duikt.
Daarom is het bij het leren van SQL handig om de gedeelde concepten achter gegevenstypen te herkennen in plaats van alleen te vertrouwen op de details van één systeem.
Het juiste gegevenstype kiezen
Een gegevenstype kiezen is soms eenvoudig, maar soms vergt het wat denkwerk. Een goede keuze maakt je data makkelijker te bevragen, houdt de opslag compact en voorkomt bugs verderop. De hoofdcategorie wordt meestal bepaald door het soort data dat je hebt.
Numerieke data
Stel dat je meetgegevens opslaat. Dan wil je uiteraard een numeriek type, geen kalender- of stringtype. Maar hoe precies wil je meten? Zijn gehele getallen oké, of heb je decimalen nodig? Wil je een vast aantal significante cijfers?
Denk vervolgens aan opslag en efficiëntie. Kies het kleinste integertype dat je data veilig kan bevatten om je tabellen efficiënt te houden. Kleinere typen gebruiken minder opslag en kunnen prestaties verbeteren, zeker bij grote tabellen. Meestal kies je een type dat groot genoeg is voor je verwachte bereik zonder ver daarboven te gaan.
Als een integer niet volstaat, kies je tussen
DECIMALenFLOAT. Floating-point-typen benaderen waarden in plaats van ze exact op te slaan, wat afrondingsfouten kan veroorzaken in financiële, wetenschappelijke of andere nauwkeurige toepassingen.DECIMALenNUMERICslaan exacte waarden op en zijn beter voor alles met prijzen of ratio’s. Wel hebbenDECIMALs doorgaans meer opslag nodig danFLOATs, afhankelijk van het aantal decimalen dat je bewaart.Teken- en stringdata
Voor strings denk je na over hoe groot elke invoer mag zijn.
Meestal geef je
VARCHAR-velden een realistische lengte in plaats van standaard de maximumlengte. Te ruime limieten vergroten zelden de flexibiliteit en kunnen toekomstige ontwikkelaars misleiden over de verwachte grootte van de data.Denk aan je verwachte input—namen, e-mails, producttitels—en kies de kolomlengte dienovereenkomstig.
Datum- en tijddata
Wees precies over wat je bij kalenderdata opslaat.
Als je alleen een datum of alleen een tijd nodig hebt, gebruik dan liever
DATEofTIMEdanDATETIME. Dat maakt je intenties duidelijker en verkleint de kans op verwarring later. Het geeft de database ook iets meer ruimte om date-only of time-only queries te optimaliseren.Booleaanse data
Gebruik waar mogelijk domeinspecifieke typen zoals
BOOLEANin plaats van omwegen zoals integers of strings. Native typen bieden ingebouwde validatie, duidelijkere semantiek en ondersteuning door databasefuncties die specifieke datatypen verwachten.Hieronder staat een samenvatting van veelvoorkomende opslagdoelen en de aanbevolen SQL-typen om die aan te pakken.
Doel
Aanbevolen gegevenstype
Waarom
Exacte numerieke waarden opslaan (geld, metingen)
DECIMALofNUMERICSlaat precieze waarden op zonder floating-point afrondingsproblemen
Korte of middellange tekst opslaan
VARCHAR(n)Efficiënte opslag met voorspelbare grootte en flexibele lengte
Lange, ongestructureerde tekst opslaan
TEXTofCLOBOntworpen voor tekstblokken zoals beschrijvingen of documenten
Alleen datum- of alleen tijdinformatie opslaan
DATEofTIMEVermijdt onnodige complexiteit en weerspiegelt de werkelijke betekenis
Flexibele, documentachtige waarden opslaan
JSONofJSONBHandig voor geneste of evoluerende structuren die niet in vaste kolommen passen
Voor lezers die hun kennis over groeperen en filteren willen opfrissen: de Intermediate SQL-cursus behandelt die kernvaardigheden.
Veelvoorkomende valkuilen en best practices
Zelfs een eenvoudig databaseschema kan problemen krijgen als gegevenstypen niet zorgvuldig zijn gekozen.
Afkapping
Als je bijvoorbeeld een kolom voor namen hebt die slechts 5 tekens toelaat, eindig je met “Micha” in plaats van “Michael”. Dit is een veelvoorkomend probleem, bekend als afkapping (truncation).
Het duikt vaak op in velden zoals namen, adressen of opmerkingen, waar variatie in de echte wereld een te optimistische limiet overstijgt. Voorkom dit door tekstvelden te dimensioneren op basis van echte voorbeelden of kies iets ruimer.
Afrondingsfouten
Een andere valkuil is onverwachte afronding wanneer floating-pointwaarden worden gebruikt voor geld of andere precieze data. Omdat
FLOATs benaderingen opslaan, kunnen kleine afwijkingen zich opstapelen en rapportages of berekeningen beïnvloeden.Kies voor alles met valuta of exacte decimalen
DECIMAL. Zo blijven de getallen stabiel.Type-mismatches
Type-mismatches kunnen ook trage queries veroorzaken, vooral bij joins of vergelijkingen.
Als een kolom als string is opgeslagen en een andere als integer (of elk een iets ander type gebruikt) en je probeert te joinen, moet de database mogelijk on-the-fly converteren. Dat kan fouten geven en onnodige overhead toevoegen.
Door gerelateerde kolommen op elkaar af te stemmen qua type vermijd je deze verborgen conversies en lopen queries soepeler.
Datumopmaak
Kalenderdata heeft zijn eigen uitdagingen.
Inconsistenties in datumopmaak zijn een belangrijke bron van verwarring wanneer systemen lokale conventies mixen of wanneer ontwikkelaars datums als strings opslaan in plaats van met echte datumtypen. Dat kan queries in de war brengen of onjuiste resultaten opleveren.
De eenvoudige oplossing is om daadwerkelijke datumtypen te gebruiken en, wanneer je met tekst werkt, een consequente, eenduidige notatie aan te houden. Ik beveel onze Time Series Analysis in SQL Server-cursus aan om de meest voorkomende kalenderproblemen in je databases te vermijden.
Best practices
Enkele best practices om je databases soepel te laten draaien:
Vul tabellen vroeg in het ontwerpproces met voorbeelddata om zwaktes in grootte- of typekeuzes te ontdekken.
Documenteer het doel en het verwachte bereik van elke kolom, zodat toekomstige wijzigingen geen mismatches introduceren.
Vermijd generieke typen als specifiekere typen de duidelijkheid vergroten.
Conclusie
Gegevenstypen bepalen hoe je database de waarden “begrijpt” die je opslaat. Ze beïnvloeden alles van opslag en prestaties tot duidelijkheid. Door te begrijpen hoe ze werken, maak je je databases betrouwbaarder en voorspelbaarder.
Voor verdere verdieping: bekijk de SQL Database Overview Tutorial en SQLite Data Types: A Close Look at Storage Classes. Ik raad ook de PostgreSQL Summary Stats and Window Functions-cursus aan, die laat zien hoe je voortschrijdende totalen en geordende statistieken berekent.
Een gegevenstype in SQL definieert welk soort data een kolom kan opslaan en hoe die data zich gedraagt bij bevragen of verwerken. Het beïnvloedt opslag, validatie, sorteren, vergelijken en rekenkundige bewerkingen.