Konstruując tabele, wprowadzając do nich jakieś wartości liczbowe często bezmyślnie wybieram typ INT. Dlaczego? Bo mało z tym typem problemów. Z jednej strony SQL serwer dobrze sobie z tym typem radzi, buduje wydajne indeksy, nie zajmuje zbyt wiele miejsca w pamięci, a z drugiej strony jeszcze mi się nie zdarzyło, żeby liczba wpisywana w dane pole przekroczyła 2.147.483.647. Ale właściwie to co jeszcze mam do wyboru?
Mam sporo – zobaczmy po kolei:
Tinyint – zakres od 0 – 255. Wystarczy na numer zmiany, na całkowitą wartość procentową, numer krzesła w sali. Wystarczy pewnie nawet na poumerowanie wszystkich sklepów sieci Biedronka, ale już na Żabkę czy kioski RUCH chyba nie!
Zobacz jak kończy się przekroczenie zakresu tej liczby:
DECLARE @var TINYINT =250;PRINT 'Dodawanie tinyint:’
PRINT @var+@var PRINT 'Dodawanie INT:’
PRINT CAST(@var AS INT) + CAST(@var AS INT)
A oto efekt tych poleceń:
Dodawanie tinyint:Msg 8115, Level 16, State 2, Line 4
Arithmetic overflow error converting expression to data type tinyint.
Dodawanie INT:
500
Jedynym ratunkiem, kiedy pracujemy na typach tinyint i chcemy wykonać działania na nich przekraczając zakres tego typu jest jawna konwersja typu na większy. Tu zostało to wykonane funkcją CAST. CAST mówi, że dana zmienna (tutaj @var) ma być potraktowana, jakby była typem INT.
Kolejny typ – smallint. Zakres od -32768 do 32767. Ma więcej liczb ujemnych niż dodatnich 🙂 Powinien wystarczyć na większość firmowych obiektów, jak np IdSamochodu, IdPracownika, CzasPracyNaRok (w godzinach), ale w minutach to już za mało…
Zobaczmy, jak wygląda przepełnienie typu:
DECLARE @varSmallInt SMALLINT = 30000; PRINT 'Dodawanie smallint:’PRINT @varSmallInt+@varSmallInt PRINT 'Dodawanie INT:’
PRINT CAST(@varSmallInt AS INT) + CAST(@varSmallInt AS INT)
A oto wynik tych czynności:
Dodawanie smallint:Msg 8115, Level 16, State 2, Line 4
Arithmetic overflow error converting expression to data type smallint.
Dodawanie INT:
60000
Również i tutaj ratunkiem jest konwersja danych na większy typ np INT.
Mamy jeszcze do dyspozycji:
- INT w zakresie od -2.147.483.648 do 2.147.483.647 , co powinno wystarczyć do ponumerowania chyba każdej firmowej transakcji, faktury oraz… wizyty baby u lekarza we wspaniałej serii dowcipów
- BIGINT o wartościach między -2^63 do 2^63 -1
Wielkości typów wpływają też na ilość zabieranego przez nie w pamięci miejsca. I tak:
- tinyint – 8 bitów
- smallint – 16 bitów
- int – 32 bity
- bigint – 64 bity