SQL数据类型NUMERIC和DECIMAL之间有什么区别?如果数据库以不同的方式对待这些问题,我想知道如何至少:
此外,数据库驱动程序对这些类型的解释有什么不同吗?
发布于 2009-12-03 18:48:20
它们在几乎所有目的上都是一样的。
有一次,不同的供应商对几乎相同的事物使用不同的名称(NUMERIC/DECIMAL)。SQL-92使它们相同,但有一个细微的差别,可以是特定于供应商的:
NUMERIC必须和定义的一样精确--因此,如果在小数点左侧定义4小数位,在小数点右侧定义4小数位,DB必须始终存储4+4小数位,不多也不能少。
如果更容易实现,DECIMAL可以允许更高的数字。这意味着数据库实际上可以存储比指定的更多的数字(因为幕后存储有额外数字的空间)。这意味着数据库可能允许在上面的4+4小数位示例中存储12345.0000,但是如果这样做可能会影响未来的计算,则仍然不允许存储1.00005。
大多数当前的数据库系统要么将DECIMAL和NUMERIC视为完美的同义词,要么将其视为行为完全相同的两种截然不同的类型。如果类型被认为是完全不同的,则可能无法在引用DECIMAL列的NUMERIC列上定义外键约束,反之亦然。
发布于 2016-11-08 14:51:56
Postgres: No difference
在表8.1中的文档描述看起来是一样的,但是没有解释为什么单独提到它,所以根据table 帖子
在Postgres没有什么区别。有两个类型名称,因为SQL标准要求我们接受这两个名称。在快速查看标准时,似乎唯一的区别是: 17)数值指定数据类型为精确数字,其十进制精度和小数位数由and指定。18)十进制指定数据类型精确数字,其十进制刻度由和实现定义的十进制精度等于或大于指定的值。 对于十进制,允许实现允许小数点左边的数字多于请求的数字。Postgres没有行使这种自由,所以对我们来说,这两种类型没有什么区别。 你好,汤姆·莱恩
还有一个页面较低的文档状态,很清楚,
十进制和数字类型是等价的。这两种类型都是SQL标准的一部分。
在别名表,decimal [ (p, s) ]也被提到为numeric [ (p, s) ]的别名。
发布于 2018-11-17 07:01:02
它们实际上是等价的,但它们是独立的类型,而不是技术上的同义词,比如ROWVERSION和TIMESTAMP --尽管它们在文档中一次被称为同义词。这是同义词的一个稍微不同的含义(例如,除了名称之外,它们是不可区分的,而不是另一个的别名)。讽刺,对吧?
实际上,我从MSDN中的措辞中解释的是:--这些类型是相同的,它们只是有不同的名称。
除了type_id值之外,这里的所有内容都是相同的:
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');我完全不知道两者之间的任何行为差异,回到SQLServer6.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在我们要求的地方,我们有显式的转换,但在我们可能期望的地方,没有显式的转换。似乎优化器也将它们视为可互换的。
就我个人而言,我更喜欢使用小数点这个词,因为它更准确,更有描述性。位也是“数字”。
https://stackoverflow.com/questions/1841915
复制相似问题