Typy danych w MySQL 8 : Liczby stało- i zmiennoprzecinkowe

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);