Je sais que les types de données NUMERIC et DECIMAL dans SQL Server fonctionnent de la même manière: la syntaxe pour les créer est la même, les plages de valeurs que vous pouvez y stocker sont les mêmes, etc.
Cependant, la documentation MSDN décrit la relation entre les deux comme ceci:
numeric est fonctionnellement équivalent à décimal.
Normalement, lorsque je vois le qualificatif " fonctionnellement équivalent", cela signifie que les deux choses ne sont pas exactement identiques, mais qu'il s'agit de deux types différents qui ne peuvent pas être distingués de l'extérieur .
Cette implication est-elle vraie? Existe-t-il des différences entre NUMERIC et DECIMAL qui se comportent de la même manière vis-à-vis d'un observateur extérieur? Ou sont-ils réellement équivalents, par exemple NUMERIC est-il simplement un synonyme hérité de DECIMAL?
la source
Réponses:
Ils sont en fait équivalents, mais ce sont des types indépendants, et non techniquement synonymes, comme
ROWVERSION
etTIMESTAMP
- bien qu'ils aient été appelés synonymes dans la documentation à la fois . C’est une signification légèrement différente de synonyme (par exemple, ils ne peuvent être distingués que par leur nom, aucun n’est un alias pour l’autre). Ironique, non?Ce que j’interprète à partir du libellé de MSDN est en réalité:
Autre que les
type_id
valeurs, tout est identique ici:Je ne connais absolument aucune différence de comportement entre les deux. Pour revenir à SQL Server 6.5, je les ai toujours traitées comme interchangeables à 100%.
Seulement si vous le faites explicitement. Vous pouvez facilement le prouver en créant une table, puis en inspectant le plan de requête pour rechercher les requêtes qui effectuent des conversions explicites ou implicites. Voici un tableau simple:
Maintenant, lancez ces requêtes et capturez le plan:
Comme indiqué dans SQL Sentry Plan Explorer *, le plan n’est pas vraiment intéressant:
Mais l'onglet Expressions est bien sûr:
Comme je l'ai mentionné ci-dessus, nous avons des conversions explicites où nous les avons demandées, mais pas de conversions explicites où nous aurions pu les attendre. Il semble que l’optimiseur les traite également comme interchangeables.
Allez-y et essayez ce test aussi (données et index).
Maintenant, lancez cette requête:
Plan n'a aucune conversion (en fait, l'onglet Expressions est vide):
Même ceux-ci ne conduisent à aucune conversion inattendue. Bien sûr, cela se voit sur le RHS dans le prédicat, mais dans aucun cas, aucune conversion ne doit avoir lieu contre les données de colonne pour faciliter la recherche (et encore moins forcer une analyse).
Personnellement, je préfère utiliser le terme
DECIMAL
simplement parce qu'il est beaucoup plus précis et descriptif.BIT
est "numérique" aussi.la source
Ils sont toutefois identiques dans la pratique (à partir du standard SQL 2003):
21) NUMERIC spécifie le type de données numeric exact, avec la précision décimale et l’échelle spécifiées par les
precision
etscale
.22) DECIMAL spécifie le type de données numérique exact, avec l’échelle décimale spécifiée par le
scale
et la précision décimale définie par l’ implémentation égale ou supérieure à la valeur spécifiéeprecision
.la source