Ich weiß, dass die Datentypen NUMERIC und DECIMAL in SQL Server gleich funktionieren: Die Syntax für deren Erstellung ist dieselbe, die Wertebereiche, die Sie in ihnen speichern können, sind dieselbe usw.
Die MSDN-Dokumentation beschreibt jedoch die Beziehung zwischen den beiden wie folgt:
numerisch ist funktional äquivalent zu dezimal.
Wenn ich das Qualifikationsmerkmal " funktional äquivalent" sehe , bedeutet dies normalerweise, dass die beiden Dinge nicht genau gleich sind, sondern dass es sich um zwei verschiedene Typen handelt, die von außen nicht zu unterscheiden sind .
Ist diese Implikation wahr? Gibt es Unterschiede zwischen NUMERIC und DECIMAL, die sich für einen externen Beobachter zufällig gleich verhalten? Oder sind sie tatsächlich gleichwertig, zB ist NUMERIC nur ein Synonym für DECIMAL?
quelle
Antworten:
Sie sind eigentlich äquivalent, aber sie sind unabhängige Typen und keine technischen Synonyme, wie
ROWVERSION
undTIMESTAMP
- obwohl sie in der Dokumentation möglicherweise zu einem Zeitpunkt als Synonyme bezeichnet wurden . Das ist eine etwas andere Bedeutung von Synonym (z. B. sind sie nicht unterscheidbar, außer im Namen, nicht einer ist ein Alias für den anderen). Ironisch, richtig?Was ich aus dem Wortlaut in MSDN interpretiere, ist tatsächlich:
Abgesehen von den
type_id
Werten ist hier alles identisch:Ich habe absolut keine Kenntnis von irgendwelchen Verhaltensunterschieden zwischen den beiden und gehe zurück auf SQL Server 6.5, habe sie immer als 100% austauschbar behandelt.
Nur wenn Sie dies ausdrücklich tun. Sie können dies auf einfache Weise beweisen, indem Sie eine Tabelle erstellen und dann den Abfrageplan auf Abfragen untersuchen, die explizite oder - wie Sie vielleicht erwarten - implizite Konvertierungen ausführen. Hier ist eine einfache Tabelle:
Führen Sie nun diese Abfragen aus und erfassen Sie den Plan:
Wie im SQL Sentry Plan Explorer * gezeigt, ist der Plan nicht wirklich interessant:
Aber die Registerkarte Ausdrücke ist sicher:
Wie ich oben ausgeführt habe, haben wir explizite Conversions, bei denen wir darum gebeten haben, aber keine expliziten Conversions, bei denen wir sie erwartet hätten. Scheint, dass der Optimierer sie auch als austauschbar behandelt.
Probieren Sie auch diesen Test aus (Daten und Indizes).
Führen Sie nun diese Abfrage aus:
Plan hat keine Conversions (die Registerkarte "Ausdrücke" ist leer):
Auch diese führen zu keinen unerwarteten Konvertierungen. Natürlich sehen Sie es auf der rechten Seite im Prädikat, aber in keinem Fall musste eine Konvertierung für die Spaltendaten durchgeführt werden, um die Suche zu erleichtern (viel weniger erzwingen Sie einen Scan).
Ich persönlich bevorzuge es, den Begriff
DECIMAL
nur zu verwenden, weil er viel genauer und aussagekräftiger ist.BIT
ist auch "numerisch".quelle
Sie sind jedoch in der Praxis identisch (ab SQL 2003-Standard):
21) Numerischer gibt den Datentyp exakte numerische, mit dem Dezimalsystem und Dezimalstellenwerte spezifiziert durch die
precision
undscale
.22) DECIMAL gibt den Datentyp genau numerisch an, wobei die durch die
scale
und die implementierungsdefinierte Dezimalgenauigkeit angegebene Dezimalskala gleich oder größer als der angegebene Wert istprecision
.quelle