Do typów danych liczbowych oprócz liczb całkowitych należą grupy typów danych liczb zmiennoprzecinkowych oraz liczb stałoprzecinkowych. Pozwalają na przechowywanie liczb rzeczywistych o wartościach stałych lub przybliżonych.
Zaczniemy od typów licz zmiennoprzecinkowych, do których zalicza się:
- FLOAT – 4 bajty, dokładność to 7-8 cyfr znaczących
- DOUBLE PRECISION – 8 bajtów, synonimy to REAL, DOUBLE, dokładność to 15 cyfr znaczących
Liczby zmiennoprzecinkowe przechowują wartości przybliżone, bo ich sposobem na przechowywanie są liczby w postaci bitowej. Dlatego też nie nadają się do wykonywania dokładnych obliczeń, czy stosowania w równościowych porównaniach z dokładnymi wartościami. Typ FLOAT jest zwany typem pojedynczej precyzji (mała liczba zmiennoprzecinkowa), typ DOUBLE (duża liczba zmiennoprzecinkowa) typem podwójnej precyzji. Świadczy o tym zakres dostępnych wartości, który możemy zobaczyć w tabeli na screenie wyżej.
Natomiast do liczb stałoprzecinkowych należy typ DECIMAL(M,D), gdzie:
- M – maksymalna liczba wszystkich cyfr w liczbie, domyślnie 10, nie więcej niż 65,
- D – maksymalna liczba cyfr po przecinku, domyślnie 0, nie więcej niż 30.
Liczby stałoprzecinkowe, przechowują dokładne wartości, bo liczba pamiętana jest w formacie znakowym. Dlatego też mogą być wykorzystywane do obliczeń księgowych. Dla DECIMAL synonimy to: DEC, NUMERIC.
Przejdźmy zatem do praktycznych przykładów. Otwieramy konsolę MySQL i wchodzimy do dowolnej bazy, u mnie baza
test
(
USE test;
), a następnie tworzymy tabelę:
CREATE TABLE t (
col_float
FLOAT
,
col_dec_default
DECIMAL
,
col_dec_4_2
DECIMAL(4,2)
);
Następnie wstawmy do każdej z tych kolumn wartość 123.343:
INSERT INTO t VALUES(
123.343
,
123.343
,
123.343
);
Jako pierwsza otrzymamy błąd z informacją, że dla ostatniej kolumny wartość jest spoza zakresu. Podobny komunikat otrzymamy po pozostawieniu dla kolumny trzeciej w przekazywanej wartości tylko 2 miejsc po przecinku:
INSERT INTO t VALUES(123.343, 123.343,
123.34
);
Powodem jest to, że ten typ danych ma podane M, czyli maksymalną liczbę wszyskich cyfr jako 4, a razem występuje ich 5. Usuwamy więc jedną z nich i próbujemy wstawić w zamina liczbę 12.34:
INSERT INTO t VALUES(123.343, 123.343,
12.34
);
Tym razem dane zostaną wstawione, a my otrzymamy informację, że liczba wstawiona do kolumny drugiej dla typu danych DECIMAL z domyślnymi wartościami (domyślnie jest to zero cyfr po przecinku), że liczba zostanie obcięta:
Dlatego w tabeli dla kolumny drugiej zamiast 123.343 zostało wstawione 123. Jeśli wstawimy liczbę, której pierwsza cyfra będzie równa 5 lub więcej liczba zostanie zaokrąglona w górę:
INSERT INTO t VALUES(123.543,
123.
5
43
, 12.54);