In SQL zijn er verschillende basisdatatypen — tekenreeksen (bijvoorbeeld VARCHAR, CHAR, TEXT), numeriek (INT, DECIMAL, FLOAT), data en tijd (DATE, TIMESTAMP). Het is cruciaal om het kleinste geschikte type voor specifieke gegevens te kiezen om ruimte te besparen en de indexering te optimaliseren. Een veelgemaakte fout is het kiezen van een type met overmatige lengte (bijvoorbeeld VARCHAR(255) in plaats van VARCHAR(50)), wat kan leiden tot onnodige hulpbronnenverliezen.
Een ander belangrijk verschil zijn de numerieke types: FLOAT slaat benaderde waarden op, terwijl DECIMAL exacte waarden opslaat, wat nuttig is voor financiële transacties. Het vergelijken van strings met verschillende coderingen kan onverwachte resultaten opleveren, als COLLATE niet in acht wordt genomen.
Voorbeeld:
-- Voorbeeld van type-inconsistentie declare @price varchar(10) = '100.99'; select @price + 1; -- Fout: kan geen string en nummer optellen -- Zonder expliciete typeconversie werkt het niet
Vraag: Wat gebeurt er als je een veld van het type VARCHAR vergelijkt met een nummer? Bijvoorbeeld: WHERE code = 123? Zal de index snel werken?
Antwoord: SQL zal proberen het nummer naar een string te converteren en als strings vergelijken. Echter, als er een numerieke index op dat veld is, zal deze niet gebruikt worden bij een stringvergelijking, en zal de query vertragen. Het wordt altijd aanbevolen om strikte datatypes te gebruiken en expliciete conversie toe te passen indien nodig.
Voorbeeld:
SELECT * FROM products WHERE code = '123'; -- Index kan gebruikt worden SELECT * FROM products WHERE code = 123; -- Index WORDT NIET gebruikt, mogelijk full scan
Geschiedenis
VARCHAR opgeslagen om verschillende valutaformaten te ondersteunen. Na enkele jaren was het nodig om producten op prijs te sorteren: de sorteringen werkten niet correct en indexering was onmogelijk. Er was een complexe migratie en typeconversie nodig, wat weken duurde.Geschiedenis
FLOAT voor het opslaan van bedragen. Bij rapportages ontstonden er verschillen door afrondingen, wat na een jaar leidde tot aanzienlijke fouten in de toewijzing van bonussen.Geschiedenis
In de logs van een startup werden datum en tijd als tekst (VARCHAR) opgeslagen. Toen het nodig was om intervallen te berekenen, bleek dat de tijd overal in verschillende formaten was, en vereiste de berekening arbeidsintensieve normaliserende parsing, wat een negatieve impact had op de prestaties.