Porównanie typów INT

9-maj-2011

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

Komentarze są wyłączone

Autor: Rafał Kraik