Zastosowanie typu DECIMAL języka SQL wymaga wcześniejszego zdefiniowania długości (liczby cyfr) przed przecinkiem oraz długości cyfr po przecinku. Jest to zapis:
A. stałoprzecinkowy
B. zmiennoprzecinkowy
C. logiczny
D. łańcuchowy
Typ DECIMAL w SQL należy do typów stałoprzecinkowych, czyli takich, w których z góry określa się precyzję zapisu liczby oraz liczbę miejsc po separatorze dziesiętnym. W praktyce zapis wygląda najczęściej tak: DECIMAL(p, s), gdzie p oznacza całkowitą liczbę cyfr, a s liczbę cyfr po przecinku. Czyli DECIMAL(10,2) pozwala przechować np. 12345678.90, bo są łącznie 10 cyfr, z czego 2 po przecinku. Moim zdaniem to jeden z ważniejszych typów w bazach danych, bo używa się go tam, gdzie nie wolno tracić dokładności: ceny produktów, kwoty faktur, stawki VAT, salda kont, wartości księgowe. Standard SQL traktuje DECIMAL i NUMERIC jako typy dokładne, w odróżnieniu od FLOAT czy REAL, które są przybliżone. Dobra praktyka branżowa jest taka, żeby do pieniędzy nie używać typów zmiennoprzecinkowych, bo mogą pojawić się dziwne zaokrąglenia, np. przy sumowaniu wielu pozycji. DECIMAL daje przewidywalny format i łatwiej kontrolować walidację danych, raporty oraz obliczenia biznesowe.
W tym pytaniu łatwo pomylić pojęcia, bo sama nazwa DECIMAL kojarzy się z przecinkiem dziesiętnym, a przecinek wielu osobom od razu przywodzi na myśl liczby zmiennoprzecinkowe. To jednak nie jest dobry trop. Typ zmiennoprzecinkowy, taki jak FLOAT albo REAL, przechowuje wartości w sposób przybliżony, zwykle zgodnie z reprezentacją binarną podobną do standardu IEEE 754. Taki zapis jest dobry do obliczeń naukowych, symulacji albo wartości bardzo dużych i bardzo małych, ale nie gwarantuje idealnej dokładności dziesiętnej. Dlatego kwota 0.1 może być wewnętrznie reprezentowana jako wartość bardzo bliska 0.1, ale nie dokładnie taka sama. W księgowości to już robi problem, serio. Typ logiczny też tu nie pasuje, bo służy do przechowywania wartości typu prawda/fałsz, na przykład TRUE albo FALSE, ewentualnie 1 i 0 zależnie od systemu baz danych. Nie definiuje się w nim liczby cyfr przed przecinkiem ani po przecinku, bo nie opisuje liczby dziesiętnej. Typ łańcuchowy, czyli CHAR, VARCHAR lub TEXT, przechowuje znaki. Da się oczywiście wpisać do tekstu wartość wyglądającą jak liczba, np. 123.45, ale to byłoby złe projektowanie kolumny, jeśli później chcemy wykonywać obliczenia, sortowanie numeryczne albo sprawdzać zakresy. Częsty błąd myślowy polega na tym, że ktoś widzi określanie długości i od razu myśli o napisie, bo VARCHAR(50) też ma długość. W DECIMAL chodzi jednak o precyzję liczbową i skalę, a więc o typ stałoprzecinkowy, zgodny z praktyką relacyjnych baz danych i sensownym modelowaniem danych liczbowych.