W SQL istnieje kilka podstawowych typów danych — tekstowe (np. VARCHAR, CHAR, TEXT), liczbowe (INT, DECIMAL, FLOAT), daty i czasu (DATE, TIMESTAMP). Bardzo ważne jest, aby wybrać najmniejszy odpowiedni typ dla konkretnych danych, aby oszczędzać miejsce i optymalizować indeksowanie. Częstym błędem jest wybór typu o nadmiarowej długości (np. VARCHAR(255) zamiast VARCHAR(50)), co może prowadzić do niepotrzebnych kosztów zasobów.
Inna ważna różnica dotyczy typów numerycznych: FLOAT przechowuje przybliżone wartości, a DECIMAL — dokładne, co jest przydatne w operacjach finansowych. Porównanie łańcuchów różnych kodowań, na przykład, może dawać nieoczekiwane wyniki, jeśli nie uwzględnić COLLATE.
Przykład:
-- Przykład pracy z niezgodnością typów declare @price varchar(10) = '100.99'; select @price + 1; -- Błąd: nie można dodać łańcucha do liczby -- Bez jawnej konwersji typów nie zadziała
Pytanie: Co się stanie, jeśli porównasz pole typu VARCHAR z liczbą? Na przykład: WHERE code = 123? Czy indeks będzie działał szybko?
Odpowiedź: SQL spróbuje przekonwertować liczbę na łańcuch i porównać jako łańcuchy. Jednak jeśli na tym polu zbudowano numeryczny indeks, nie będzie on używany podczas porównania łańcuchów, a zapytanie zostanie spowolnione. Zawsze zaleca się używanie ścisłego typu danych oraz jawnej konwersji, jeśli to konieczne.
Przykład:
SELECT * FROM products WHERE code = '123'; -- Indeks może być używany SELECT * FROM products WHERE code = 123; -- Indeks NIE jest używany, możliwy pełny skan
Historia
VARCHAR, aby wspierać różne formaty walutowe. Po kilku latach potrzeba było sortować towary według ceny: sortowanie działało niepoprawnie, a indeksacja była niemożliwa. Potrzebna była skomplikowana migracja i konwersja typów, co zajęło tygodnie.Historia
FLOAT do przechowywania kwot. Przy raportach pojawiły się różnice z powodu zaokrągleń, co po roku doprowadziło do znaczących błędów w rozdzielaniu premii.Historia
W logach startupu data i czas były zapisywane jako tekst (VARCHAR). Kiedy potrzebne było obliczanie interwałów, okazało się, że czas był wszędzie w różnych formatach, a obliczenia wymagały czasochłonnej normalizacji parsowania, co negatywnie wpłynęło na wydajność.