| Termin | Definicja |
|---|---|
| FLOAT vs DECIMAL | FLOAT vs DECIMAL to porównanie dwóch typów danych liczbowych SQL Server, różniących się precyzją i sposobem zapisu wartości. FLOAT i DECIMAL w SQL Server: dwa różne modele zapisu liczbyW SQL Server typ FLOAT służy do przechowywania liczb przybliżonych. Wartość jest zapisywana w formacie zmiennoprzecinkowym, dlatego nie każda liczba dziesiętna może zostać odwzorowana dokładnie. Typ FLOAT jest przeznaczony przede wszystkim do obliczeń naukowych, inżynierskich i statystycznych, w których istotny jest szeroki zakres wartości oraz możliwość obsługi bardzo małych i bardzo dużych liczb, a niewielka różnica wynikająca z reprezentacji binarnej jest dopuszczalna. DECIMAL, nazywany także NUMERIC, jest typem dokładnym. Definiuje się go za pomocą parametrów DECIMAL(p,s), gdzie p oznacza całkowitą precyzję, czyli maksymalną liczbę cyfr przechowywanych po obu stronach separatora dziesiętnego, a s określa liczbę cyfr po separatorze. Przykład DECIMAL(12,2) pozwala przechować maksymalnie dziesięć cyfr przed separatorem i dwie cyfry po nim. Wartość musi mieścić się w zadanym zakresie, w przeciwnym razie SQL Server może zgłosić błąd przepełnienia albo wykonać konwersję zgodną z regułami danego wyrażenia. Precyzja, zakres i rozmiar danychW SQL Server parametr FLOAT(n) określa precyzję binarną w zakresie od 1 do 53 bitów. Dla n od 1 do 24 typ zajmuje 4 bajty i jest traktowany jako odpowiednik REAL, natomiast dla n od 25 do 53 zajmuje 8 bajtów. Jeżeli parametr n nie zostanie podany, domyślnie stosowana jest wartość 53. Nie oznacza to jednak dokładnego przechowywania 53 cyfr dziesiętnych. Jest to liczba bitów używanych w reprezentacji zmiennoprzecinkowej, a nie liczba cyfr po przecinku. DECIMAL może mieć precyzję od 1 do 38, a skala nie może być większa od precyzji. Rozmiar przechowywanej wartości zależy od precyzji: dla p od 1 do 9 wynosi 5 bajtów, od 10 do 19 — 9 bajtów, od 20 do 28 — 13 bajtów, a od 29 do 38 — 17 bajtów. Zwiększenie precyzji DECIMAL może więc zwiększyć rozmiar wiersza, indeksu lub struktury tymczasowej. Wybór parametrów powinien wynikać z rzeczywistego zakresu danych, ponieważ DECIMAL(38,18) i DECIMAL(12,2) opisują zupełnie inne wymagania dotyczące skali i zakresu. Różnice widoczne w porównaniach i obliczeniachNajważniejsza praktyczna różnica pojawia się podczas porównań. Liczba zapisana jako FLOAT może być wewnętrznie nieco inna od wartości dziesiętnej wpisanej przez użytkownika, nawet gdy wyświetlany wynik wygląda identycznie. Z tego powodu porównanie kolumny FLOAT z konkretną wartością za pomocą operatora równości może nie zachować się tak, jak oczekuje osoba analizująca dane. Przy obliczeniach na FLOAT bezpieczniejsze bywa sprawdzanie, czy różnica mieści się w określonej tolerancji, na przykład przez porównanie wartości bezwzględnej różnicy z ustalonym progiem. DECIMAL zachowuje dokładność dziesiętną w granicach określonych przez p i s, dlatego lepiej nadaje się do kwot, stawek, podatków, cen, sald, pomiarów wymagających ustalonej liczby miejsc po przecinku oraz wartości, które muszą być powtarzalne przy kolejnych obliczeniach. Dokładność nie oznacza jednak braku ograniczeń. Wynik działania na kilku wartościach DECIMAL może otrzymać własną precyzję i skalę zgodnie z regułami SQL Server. W rezultacie może dojść do zaokrąglenia części ułamkowej albo do przepełnienia, jeśli wyliczony wynik nie mieści się w typie docelowym. Mieszanie FLOAT i DECIMAL w jednym wyrażeniu wymaga ostrożności. SQL Server stosuje reguły pierwszeństwa typów i konwersji, więc wynik może zostać przeliczony do typu o innych właściwościach niż pierwotne kolumny. Konwersja FLOAT do DECIMAL może wymagać zaokrąglenia, a konwersja DECIMAL do FLOAT może utracić dokładność dziesiętną. Jawne użycie CAST lub CONVERT pozwala określić moment konwersji i ograniczyć niejednoznaczność, ale nie odzyska informacji utraconej wcześniej podczas zapisu w typie przybliżonym. Dobór typu w tabeli i podczas diagnostyki danychPrzy projektowaniu tabeli najpierw należy ustalić znaczenie przechowywanej liczby. Jeżeli wartość reprezentuje pieniądze albo wynik, który musi być zgodny co do określonych miejsc dziesiętnych, właściwym punktem wyjścia jest DECIMAL z parametrami dobranymi do maksymalnego zakresu i wymaganej skali. Jeżeli dane opisują wielkość fizyczną, wynik modelu obliczeniowego lub wartości o bardzo szerokim zakresie, dla których dopuszczalna jest reprezentacja przybliżona, można rozważyć FLOAT. Sam fakt, że kolumna przechowuje liczby z przecinkiem, nie jest wystarczającym powodem do wybrania FLOAT. Diagnostyka problemu powinna obejmować definicję kolumny, typy parametrów procedur i funkcji, jawne oraz niejawne konwersje, a także sposób użycia wartości w filtrach, agregacjach i indeksach. Warto sprawdzić, czy liczby nie są najpierw wczytywane do FLOAT, a dopiero później rzutowane na DECIMAL, ponieważ na tym etapie część dokładności mogła już zostać utracona. Należy również zweryfikować dane graniczne, takie jak wartości bliskie maksymalnej precyzji, liczby ujemne, zera oraz wyniki dzielenia. Dopiero porównanie oczekiwanego modelu danych z faktycznym typem SQL Server pozwala rozstrzygnąć, czy obserwowane różnice wynikają z błędnego zapisu, zaokrąglenia, przepełnienia czy prawidłowego zachowania typu przybliżonego. |