它们实际上是等效的,但是它们是独立的类型,在技术上不是同义词,例如ROWVERSION和TIMESTAMP-尽管它们可能在文档中一次被称为同义词。 这与同义词的含义稍有不同(例如,除了名称上,它们是无法区分的,没有一个是另一个的别名)。 具有讽刺意味,对不对?
我从MSDN中的措辞解释的实际上是:这些类型是相同的,只是名称不同。
除了type_id值之外,这里的所有内容都是相同的:
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');
我完全不知道两者之间的任何行为差异,回到SQL Server 6.5,始终将它们视为100%可互换的。
for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?
仅当您明确地这样做时。 您可以通过创建一个表,然后检查查询计划中执行显式或隐式转换的查询来轻松证明这一点。 这是一个简单的表:
CREATE TABLE [dbo].[NumDec]
(
[num] [numeric](18, 0) NULL,
[dec] [decimal](18, 0) NULL
);
现在运行以下查询并捕获计划:
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
我们在要求的地方进行了明确的转化,但在我们可能期望的地方没有进行明确的转化。 似乎优化器也将它们视为可互换的。
就我个人而言,我更喜欢使用DECIMAL一词,因为它更准确和更具描述性。 BIT也是“数字”。