Zielony Smok - logo witryny

Numeryczne typy danych

Typy numeryczne w Derby dzielą się na:

  1. całkowite
    1. SMALLINT – 2 bajty (16 bitów)
    2. INTEGER – 4 bajty (32 bity)
    3. BIGINT – 8 bajtów (64 bity)
  2. zmiennoprzecinkowe (przybliżone)
    1. REAL – 4 bajty (32 bity)
    2. DOUBLE – 8 bajtów (64 bity)
    3. FLOAT – ze wskazaną dokładnością
  3. liczby o wskazanej precyzji
    1. DECIMAL – ze wskazaną dokładnością
    2. NUMERIC – identyczny z typem DECIMAL (alias)

Przy wykonywaniu obliczeń arytmetycznych (w wyrażeniach) mogą być użyte różne typy danych. Jeżeli w wyrażeniu występują wyłącznie typy całkowite, a najwyższym typem jest SMALLINT – wynik jest typu INTEGER. Jeśli najwyższym typem jest inny typ – to wynik jest tego typu co najwyższy typ występujący w wyrażeniu.

Jeżeli w wyrażeniu występują zarówno typy całkowite jak i inne albo wyłącznie inne i nie występuje typ DECIMAL, to wynik jest typu DOUBLE PRECISION. Jeśli typ DECIMAL występuje – to wynik jest tego typu.

Można to przedstawić w tabelce:

Zasady promocji typów w wyrażeniach
Najwyższy typ danych w wyrażeniu Typ wyniku
SMALLINT INTEGER
INTEGER INTEGER
BIGINT BIGINT
REAL DOUBLE
DOUBLE DOUBLE
FLOAT DOUBLE
DECIMAL DECIMAL>

Przy wstawianiu danych do tabeli w bazie wartość typu zmiennoprzecinkowego wyższego można wstawić do kolumny o niższym typie jeśli wartość wyższego typu nie jest większa od wartości najwyższej dla typu kolumny. Jeśli wstawiana wartość przekracza maksymalną wartość dopuszczalną dla typu – wyrzucany jest wyjątek.

Jeśli wartość zmiennoprzecinkowa będzie wstawiana do typu całkowitego to wstawiona zostanie wyłącznie część całkowita, a część ułamkowa zostanie odcięta.

Dane typu INTEGER mogą być wstawiane do kolumn DECIMAL jeśli typ DECIMAL ma wystarczającą precyzję. Jeśli precyzja jest zbyt mała – zostanie wyrzucony wyjątek.

W przypadku użycia liczb typu DECIMAL podawana jest:

  • precyzja p- oznacza całkowitą liczbę cyfr w liczbie, czyli sumę liczb przed przecinkiem i po przecinku
  • skala s- czyli liczbę miejsc po przecinku

Precyzja i skala wyniku zależy od skali i precyzji składników wyrażenia.

Jeżeli wykonujemy obliczenia na dwóch liczbach A (Ap, As) i B(Bp, Bs) to wynik C(Cp, Cs) będzie miał następującą skalę: 

Skala wyniku przy działaniach na wartościach DECIMAL
Działanie Skala wyniku Cs
Mnożenie A * B Cs = As + Bs
Dzielenie A / B Cs = 31 – Ap + As – Bs
funkcja AVG(A, B) Cs = max(max(As, Bs), 4)
Wszystkie pozostałe Cs = max(As, Bs)

 

Precyzja wyniku przy działaniach na wartościach DECIMAL
Działanie Precyzja wyniku Cp
Mnożenie A * B Cp = Ap + Bp
Dzielenie A / B Cp = Ap – As + Bp + max(As + Bp – Bs + 1, 4)
Wszystkie pozostałe Cp = max(Ap – As, Bp – Bs) + max(As, Bs) + 1