Wiem, że typy danych NUMERIC i DECIMAL w SQL Server działają tak samo: składnia ich tworzenia jest taka sama, zakresy wartości, które można w nich przechowywać, są takie same itp.
Dokumentacja MSDN opisuje jednak związek między nimi w następujący sposób:
numeryczny jest funkcjonalnie równoważny dziesiętnemu.
Normalnie, kiedy widzę kwalifikator „ funkcjonalnie równoważny”, oznacza to, że dwie rzeczy nie są dokładnie takie same, ale że są to dwa różne typy, które są nie do odróżnienia od zewnątrz .
Czy ta implikacja jest prawdziwa? Czy istnieją różnice między NUMERYCZNYM a DECIMALNYM, które akurat zachowują się tak samo dla obserwatora zewnętrznego? A może faktycznie są one równoważne, np. Czy NUMERIC jest po prostu synonimem DECIMAL?
sql-server
KutuluMike
źródło
źródło
Odpowiedzi:
W rzeczywistości są one równoważne, ale są niezależnymi typami, a nie technicznie synonimami, takimi jak
ROWVERSION
iTIMESTAMP
- chociaż mogły być jednocześnie określane w dokumentacji jako synonimy . Jest to nieco inne znaczenie synonimu (np. Są nierozróżnialne, z wyjątkiem nazwy, żaden nie jest pseudonimem dla drugiego). Ironiczne, prawda?To, co interpretuję ze sformułowania w MSDN, to w rzeczywistości:
Poza
type_id
wartościami wszystko tutaj jest identyczne:Nie mam absolutnie żadnej wiedzy na temat różnic w zachowaniu między nimi, a wracając do SQL Server 6.5, zawsze traktowałem je jako w 100% wymienne.
Tylko jeśli zrobisz to wyraźnie. Możesz to łatwo udowodnić, tworząc tabelę, a następnie sprawdzając plan zapytań pod kątem zapytań, które wykonują jawne lub - można się spodziewać - niejawne konwersje. Oto prosty stół:
Teraz uruchom te zapytania i zrób plan:
Jak pokazano w SQL Sentry Plan Explorer *, plan nie jest tak naprawdę interesujący:
Ale zakładka Wyrażenia jest z pewnością:
Jak skomentowałem powyżej, mamy wyraźne konwersje tam, gdzie o nie poprosiliśmy, ale żadnych wyraźnych konwersji, w których moglibyśmy się ich spodziewać. Wydaje się, że optymalizator również traktuje je jako wymienne.
Śmiało i wypróbuj również ten test (dane i indeksy).
Teraz uruchom to zapytanie:
Plan nie zawiera żadnych konwersji (w rzeczywistości karta Wyrażenia jest pusta):
Nawet te nie prowadzą do nieoczekiwanych konwersji. Oczywiście widzisz to na RHS w predykacie, ale w żadnym wypadku nie musiała wystąpić żadna konwersja w stosunku do danych kolumny, aby ułatwić wyszukiwanie (znacznie mniej wymuszając skanowanie).
Osobiście wolę używać tego terminu
DECIMAL
tylko dlatego, że jest on o wiele bardziej dokładny i opisowy.BIT
jest również „numeryczny”.źródło
Są jednak identyczne w praktyce (ze standardu SQL 2003):
21) NUMERIC określa dokładny typ danych z dokładnością dziesiętną i skalą określoną przez
precision
iscale
.22) DECIMAL określa dokładny numeryczny typ danych, przy czym skala dziesiętna jest określona przez
scale
i precyzja dziesiętna zdefiniowana w implementacji jest równa lub większa niż wartość określonejprecision
.źródło