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?
Ce sont les mêmes. Numérique est fonctionnellement équivalent à décimal.
MSDN: décimal et numérique
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>.
À 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 ;)
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.
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.
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