programowanieProgramista Backend

Wyjaśnij różnice między typami danych w SQL. Jakie pułapki mogą się pojawić w przypadku niezgodności typów danych i jak wpływa to na wydajność oraz poprawność działania zapytań? Podaj przykłady.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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 podchwytliwe.

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

W sklepie internetowym pole "cena" przechowywano jako 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

W jednym z banków programista użył typu 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ść.