web-dev-qa-db-fra.com

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

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?

121
Dhana

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

MSDN: décimal et numérique

101
Guffa

Voici ce que dit alors la norme SQL2003 (§ 6.1 Types de données) à propos des 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>.
39
Joakim Backman

À ma connaissance, il n'y a pas de différence entre les types de données NUMERIC et DECIMAL. Ils sont synonymes les uns des autres 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.

Modifier:

Peut-être est-ce que DECIMAL est la norme ANSI SQL et NUMERIC que Mircosoft préfère comme plus communément utilisé dans les langages de programmation. ...Peut être ;)

11
kevchadders

La réponse de Joakim Backman est spécifique, mais cela peut apporter une clarté supplémentaire.

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

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

Il semble que la différence sur quelques-unes des implémentations de SQL réside dans l'intégrité des données. DECIMAL autorise le débordement par rapport à ce qui est défini en fonction de certains paramètres système par défaut, contrairement à NUMERIC.

1
Alex Firsov

En réalité, ils sont équivalents, mais ce sont des types indépendants et non techniquement synonymes, tels que ROWVERSION et TIMESTAMP, bien qu’ils aient parfois été désignés comme des synonymes dans la documentation. C’est un sens légèrement différent 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 dans le texte de MSDN, c’est en fait: Ces types sont identiques, ils ont juste des noms différents.

Hormis les valeurs type_id, tout est identique ici:

SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');

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 100% interchangeables.

for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?

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:

    CREATE TABLE [dbo].[NumDec]
(
    [num] [numeric](18, 0) NULL,
    [dec] [decimal](18, 0) NULL
);

Maintenant, lancez ces requêtes et capturez le plan:

DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);

    SELECT 
      CONVERT(DECIMAL(18,0), [num]), -- conversion
      CONVERT(NUMERIC(18,0), [dec])  -- conversion
    FROM dbo.NumDec
    UNION ALL SELECT [num],[dec] 
      FROM dbo.NumDec WHERE [num] = @dec  -- no conversion
    UNION ALL SELECT [num],[dec] 
      FROM dbo.NumDec WHERE [dec] = @num; -- no conversion

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 étant interchangeables .. Pour plus de détails, visitez le lien Décimal et numérique

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.

0
Coder Girl

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
0
Raman Grewal