2012-05-15 22 views
9

W kolumnie DECIMAL (M, D) MySQL daje opcję dla zakresu D od 0 do 30.Jaki jest pożytek z DECIMAL (x, 0)?

Czy jest jakiś drobny powód, którego mi brakowało przy opcji 0? Czy liczba dziesiętna nie ma po przecinku liczby całkowitej?

Kiedy i dlaczego chciałbym podać DECIMAL, który nie ma miejsc dziesiętnych?

+0

Biorąc pod uwagę problem, który pan przeczytał i zrozumiał pytanie, nie zgadzam się z tym. Dziękujemy za usunięcie "odpowiedzi". – Leo

+0

Dobra, te poprzednie komentarze odnoszą się do http://stackoverflow.com/users/166390/pst, który przyszedł tutaj nie przeczytał mojego pytania, zadeptał go, zredagował tytuł, usunął jego ślady i uciekł. – Leo

+0

To pytanie spotkało się z zaskakującą liczbą edycji, z których większość utrudniła czytanie i podobną liczbę przywracającą. Jeśli musisz dodać własną masę rzeźby, to przynajmniej nie poprawiaj mojej gramatyki języka angielskiego, używając niepoprawnej drugiej wersji językowej. – Leo

Odpowiedz

8

Zakres numerów DECIMAL type jest znacznie większy niż w przypadku INTEGER lub BIGINT. Największa liczba, którą możesz przechowywać w DECIMAL (65, 0), to 65 dziewiątek. Największa liczba w BIGINT to 18446744073709551615.

DECIMAL (x, 0) jest często nieco droższy dla małych liczb. Rozważ użycie zdefiniowanego INTEGER type, jeśli twoje liczby znajdują się w zakresie jednego z nich.


Wymóg przechowywania w bajtach na ułamek dziesiętny (x, 0) pola zależy od x według tego wzoru:

Storage = x/9 + Leftover 
Leftover = round_up((x % 9)/2) (i.e., about half of the leftover digits) 

można przeczytać więcej na temat przechowywania requirements for numeric types w instrukcji MySQL i porównaj dla siebie.

+1

Więc to, co mówisz, to sposób na fałszowanie VERYBIGINT? – Leo

+0

Tak, tak myślę. Mieli typ danych do przechowywania liczb do określonej liczby cyfr, a następnie po prostu dozwolone części dziesiętne były zerowe. Prawdopodobnie posiadanie 'D> = 0' jest proste, gdy masz już' D> = 1', a ktoś może go kiedyś potrzebować. Pamiętaj jednak, że obliczenia na polu mogą być znacznie wolniejsze niż w przypadku pól INTEGER; Nie próbowałem tego, ale mam przeczucie, że powinieneś to znaleźć przed wykonaniem ciężkich obliczeń przy użyciu dużych wartości DECIMAL. –

1

W dużych rozmiarach można przechowywać tylko cyfry, które nie są większe niż 18 446 744 073 709 551 615. Jest to 20 cyfr, ale w DECIMAL można określić nawet 65 cyfr do zapisania. Również z int nie można bezpośrednio ograniczyć liczby cyfr do małej liczby (na przykład do jednego). Dzięki temu jest bardziej elastyczny i jeśli chcesz go rozwinąć w istniejącej bazie danych, jest to łatwiejsze.

+1

Co masz na myśli przez "rozwinięcie go w istniejącej bazie danych"? Zauważ też, że dla mniejszych numerów istnieją już zdefiniowane typy INTEGER (TINYINT, SMALLINT, ...), które wykorzystują tę samą ilość pamięci (lub mniej w niektórych przypadkach, np. Jeśli twój numer jest zawsze <255 potrzebujesz 1 bajta z TINYINT lub 2 bajty z DECIMAL (3, 0) Rozumiem jednak możliwą wartość tylko ograniczeń nałożonych przez DECIMAL, jednakże: –

2

Poza pozwalające przechowywać wartości większe niż BIGINT, można użyć DECIMAL(x,0) jeśli chcesz:

  • pozwalają Wartości w zakresie -9, ... , +9: wykorzystać DECIMAL(1,0) (używa 1 bajt)

  • pozwalają wartości w zakresie -99, ... , +99: użyj DECIMAL(2,0) (używa 1 bajta)

  • zezwól na wartości w zakresie -999, ... , +999: użyj DECIMAL(3,0) (wykorzystuje 2 bajty)

  • pozwalają Wartości w zakresie -9999, ... , +9999: wykorzystać DECIMAL(4,0) (wykorzystuje 2 bajty)

...

  • zezwolić na wartości w przedziale -999999999, ... , +999999999 : użyj DECIMAL(9,0) (używa 4 bajty)

... itp. (do DECIMAL(65,0), który używa 29 bajtów)

+0

To naprawdę nie wyjaśnia tego pytania, dlaczego tego chcesz? na liczbę cyfr? Ponieważ do przechowywania TINYINT, SMALLINT, itp., są co najmniej tak dobre lub lepsze. –

Powiązane problemy