Existe-t-il une différence entre DECIMAL et NUMERIC dans SQL Server?

127

Existe-t-il une différence entre les types de données DECIMAL et NUMERIC dans SQL Server?

Quand devrais-je utiliser DECIMAL et quand NUMERIC?

Dhanapal
la source

Réponses:

105

Ce sont les mêmes. Numérique est fonctionnellement équivalent à décimal.

MSDN: décimal et numérique

Guffa
la source
4
L'équivalence fonctionnelle n'est pas la même chose que l'égalité. En fait, dans les diapositives de l'instructeur du cours MS6232A, il y a un commentaire ajouté qu'ils sont PRESQUE les mêmes. Dans le même temps, aucune recommandation n'est faite par Microsoft concernant l'un ou l'autre (cependant DECIMAL a plus de sens, car il s'agit d'un type de données standard au lieu d'un type de données hérité de Sybase). Je me demande toujours quelle est la vraie différence (derrière les écrans) :-).
vstrien
22
@vstrien: La seule différence que je peux trouver est que le standard SQL-92 decimalest exactement aussi précis que déclaré, alors qu'il numericest au moins aussi précis que déclaré. Dans SQL Server, les deux sont exactement aussi précis que déclaré, c'est-à-dire qu'il n'utilise pas la flexibilité numericque la norme permet.
Guffa
17
Notez cependant que SQL Server ne les traite pas comme interchangeables: si, par exemple, vous avez une colonne «parent» au format «DECIMAL (18,0)» et que vous essayez d’y ajouter une clé étrangère qui référence un colonne au format "NUMERIC (18,0)", vous obtiendrez l'erreur Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'. Ils doivent tous les deux être NUMERIC (x, y), ou tous les deux être DECIMAL (x, y).
Doug_Ivison
7
@Guffa: votre réponse contredit la norme SQL2003 citée sur stackoverflow.com/a/759606/14731 . Plus précisément, decimalest au moins aussi précis que déclaré, alors qu'il numericest exactement aussi précis que déclaré.
Gili
3
@Gili: Oui, après avoir examiné le matériel original, il semble que vous ayez raison de les avoir échangés.
Guffa
41

Voici ce que dit alors la norme SQL2003 (§6.1 Types de données) sur les deux:

 <exact numeric type> ::=
    NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | SMALLINT
  | INTEGER
  | INT
  | BIGINT

 ...

21) NUMERIC specifies the data type
    exact numeric, with the decimal
    precision and scale specified by the
    <precision> and <scale>.

22) DECIMAL specifies the data type
    exact numeric, with the decimal scale
    specified by the <scale> and the
    implementation-defined decimal
    precision equal to or greater than the
    value of the specified <precision>.
Joakim Backman
la source
Vous avez un lien pour cela s'il vous plaît?
gbn
2
Wiscorp a une version préliminaire de la norme à télécharger ( wiscorp.com/sql_2003_standard.zip ), si vous voulez la version finale, vous devez l'acheter ( en.wikipedia.org/wiki/SQL2003#Documentation_availability ).
Joakim Backman
6
Notez qu'il s'agit de la norme SQL et non d'une description de la façon dont SQL Server l'implémente.
Guffa
2
C'est bien de savoir que c'est une autre règle que Microsoft a décidé d'ignorer. :)
one.beat.consumer
11

À ma connaissance, il n'y a aucune différence entre les types de données NUMERIC et DECIMAL. Ils sont synonymes l'un de l'autre et l'un ou l'autre peut être utilisé. Les types de données DECIMAL et NUMERIC sont des types de données numériques avec une précision et une échelle fixes.

Éditer:

S'adressant à quelques collègues, peut-être que cela a quelque chose à voir avec DECIMAL étant le standard SQL ANSI et NUMERIC étant celui que Mircosoft préfère car il est plus communément trouvé dans les langages de programmation. ...Peut être ;)

kevchadders
la source
Re la modification: Non - voir la réponse de @ JoakimBackman ci-dessus - il cite le standard SQL avec à la fois NUMERIC et DECIMAL.
Ingénieur inversé le
1

Ce sont des synonymes, pas de différence du tout. Les types de données Decimal et Numeric sont des types de données numériques avec une précision et une échelle fixes.

-- Initialize a variable, give it a data type and an initial value

declare @myvar as decimal(18,8) or numeric(18,8)----- 9 bytes needed

-- Increse that the vaue by 1

set @myvar = 123456.7

--Retrieve that value

select @myvar as myVariable
Raman Grewal
la source
1

La réponse de Joakim Backman est précise, mais cela peut apporter plus de clarté.

Il y a une petite différence. Selon SQL For Dummies, 8e édition (2013):

Le type de données DECIMAL est similaire à NUMERIC. ... La différence est que votre implémentation peut spécifier une précision supérieure à celle que vous spécifiez - si tel est le cas, l'implémentation utilise la plus grande précision. Si vous ne spécifiez pas de précision ou d'échelle, l'implémentation utilise les valeurs par défaut, comme elle le fait avec le type NUMERIC.

Il semble que la différence sur certaines implémentations de SQL réside dans l'intégrité des données. DECIMAL permet un dépassement de ce qui est défini sur la base de certaines valeurs par défaut du système, alors que NUMERIC ne le fait pas.

Alex Firsov
la source
-2

Ce sont exactement les mêmes. Lorsque vous l'utilisez, soyez cohérent. Utilisez l'un d'entre eux dans votre base de données

Faruk
la source