首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >十进制与数字之差

十进制与数字之差
EN

Stack Overflow用户
提问于 2009-12-03 18:30:09
回答 3查看 50.1K关注 0票数 54

SQL数据类型NUMERICDECIMAL之间有什么区别?如果数据库以不同的方式对待这些问题,我想知道如何至少:

  • SQL Server
  • 甲骨文
  • Db/2
  • MySQL
  • PostgreSQL

此外,数据库驱动程序对这些类型的解释有什么不同吗?

EN

回答 3

Stack Overflow用户

发布于 2009-12-03 18:48:20

它们在几乎所有目的上都是一样的。

有一次,不同的供应商对几乎相同的事物使用不同的名称(NUMERIC/DECIMAL)。SQL-92使它们相同,但有一个细微的差别,可以是特定于供应商的:

NUMERIC必须和定义的一样精确--因此,如果在小数点左侧定义4小数位,在小数点右侧定义4小数位,DB必须始终存储4+4小数位,不多也不能少。

如果更容易实现,DECIMAL可以允许更高的数字。这意味着数据库实际上可以存储比指定的更多的数字(因为幕后存储有额外数字的空间)。这意味着数据库可能允许在上面的4+4小数位示例中存储12345.0000,但是如果这样做可能会影响未来的计算,则仍然不允许存储1.00005

大多数当前的数据库系统要么将DECIMALNUMERIC视为完美的同义词,要么将其视为行为完全相同的两种截然不同的类型。如果类型被认为是完全不同的,则可能无法在引用DECIMAL列的NUMERIC列上定义外键约束,反之亦然。

票数 47
EN

Stack Overflow用户

发布于 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) ]的别名。

票数 6
EN

Stack Overflow用户

发布于 2018-11-17 07:01:02

它们实际上是等价的,但它们是独立的类型,而不是技术上的同义词,比如ROWVERSION和TIMESTAMP --尽管它们在文档中一次被称为同义词。这是同义词的一个稍微不同的含义(例如,除了名称之外,它们是不可区分的,而不是另一个的别名)。讽刺,对吧?

实际上,我从MSDN中的措辞中解释的是:--这些类型是相同的,它们只是有不同的名称。

除了type_id值之外,这里的所有内容都是相同的:

代码语言:javascript
复制
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');

我完全不知道两者之间的任何行为差异,回到SQLServer6.5,我总是将它们视为100%可互换的。

代码语言:javascript
复制
for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?

只有当你明确地这样做的时候。您可以轻松地通过创建一个表,然后检查查询计划中执行显式或--您可能期望的--隐式转换的查询,来证明这一点。这里有一张简单的桌子:

代码语言:javascript
复制
    CREATE TABLE [dbo].[NumDec]
(
    [num] [numeric](18, 0) NULL,
    [dec] [decimal](18, 0) NULL
);

现在运行这些查询并捕获计划:

代码语言:javascript
复制
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

在我们要求的地方,我们有显式的转换,但在我们可能期望的地方,没有显式的转换。似乎优化器也将它们视为可互换的。

就我个人而言,我更喜欢使用小数点这个词,因为它更准确,更有描述性。位也是“数字”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1841915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档