我们的一位客户使用DECIMAL(18,0)
他的SQL Server 2008R2数据库中的数据类型作为某些列。由于列的增长非常缓慢,因此他最近提议更改数据类型DECIMAL(5,0)
以重新获得一些存储空间。
根据MSDN库,与DECIMAL(5,0)
数据类型一样,DECIMAL(9,0)
数据类型的存储空间为5个字节。INT
是小1个字节,但可以存储-2 ^ 31到2 ^ 31范围内的所有内容,而不是DECIMAL(5,0)
可以存储的-99,999到99,999 。即使是最大的DECIMAL
5个字节(DECIMAL(9,0)
),也只能存储-999,999,999到999,999,999(小于范围的一半)范围内的整数INT
4字节)。
我可以想到使用DECIMAL
over 的两个“好处” INT
:
- 之后可以增加规模,而无需使用更多的存储空间
- 可以将精度扩展到38位,而无需更改数据类型
但是我认为这些并不是真正的好处:
- 将比例添加到整数仅在极少数情况下才有意义(在大多数情况下比例确实有所不同,也可以预先添加)
- SQL Server将每个精度/小数位组合视为不同的数据类型,因此在提高精度或小数位时,不会单独保留数据类型。
这让我想知道:DECIMAL(5,0)
整数数据类型的附加好处是什么?
1
一种好处是五位数的限制。但是我想知道通过这样的更改您可以节省多少存储空间。
—
dezso 2012年
IMO,如果只需要确保列值落在一个范围内,请使用检查约束。我认为,这里唯一需要考虑的是,将来是否有可能该列需要小数。
—
乔恩·塞格尔
如果他们担心存储空间,则比使用压缩更适合。使用十进制(x,0)代替int / bigint没有明显的好处。
—
罗伯特·L·戴维斯
decimal(x,0)
和整数类型之间的另一个区别在于算术除法本身。如果将一个整数除以一个整数,则会得到一个整数。如果将小数(x,0)除以整数,则将得到小数(x + 6,6)。
@AndriyM,我认为这是最大的好处。将其改写为答案而不是评论,我将其标记为答案。
—
vstrien 2013年