在PostgreSQL 10中,我正在创建一个包含数字列的表。我知道此列中的值必须精确,但是我不确定最终值的确切大小。
value NUMERIC
vs。
value NUMERIC(20, 2)
不指定精度而不是给任意大的精度有什么优点或缺点?
答案 0 :(得分:4)
指定精度会对您的数据产生两个影响:
舍入值:
SELECT 100.005::NUMERIC(20,2) -- 100.01
如果您的值太大,则会引发错误:
SELECT 100.005::NUMERIC(3,2) -- ERROR: numeric field overflow
就最佳做法而言-我认为这取决于您数据的性质。通常,显式总是比隐式好。
答案 1 :(得分:1)
数字所需的磁盘大小受其大小限制。如果未指定小数位数,则限制为最大可能的小数位数,即16383
大小计算为follow:
数值实际存储时没有任何额外的前导或 尾随零。因此,列的声明精度和小数位数 是最大值,不是固定分配。 [...]实际存储 每组四个十进制数字的要求是两个字节,再加上 三到八个字节的开销。
因此,如果您输入的值具有固定格式,则使用任意大的精度或完全不使用小数位将没有任何区别。但是,如果使用“无限”的小数位数或无意义的小数位数来获得值,则不使用小数位将需要更多磁盘空间。