【发布时间】:2014-05-28 05:25:37
【问题描述】:
我有 PostgreSQL 9.3 的工作代码:
ALTER TABLE meter_data ALTER COLUMN w3pht TYPE float USING (w3pht::float);
但不知道如何设置precision和scale。
【问题讨论】:
标签: postgresql types precision ddl arbitrary-precision
我有 PostgreSQL 9.3 的工作代码:
ALTER TABLE meter_data ALTER COLUMN w3pht TYPE float USING (w3pht::float);
但不知道如何设置precision和scale。
【问题讨论】:
标签: postgresql types precision ddl arbitrary-precision
float 类型没有精度和小数位数。如果需要,请改用numeric(precision, scale)。
数据类型
real和double precision是不精确的可变精度数值类型。
对于您给定的示例:
ALTER TABLE meter_data ALTER COLUMN w3pht TYPE numeric(15,2)
USING w3pht::numeric(15,2) -- may or may not be required
手册:
如果没有从旧类型到新类型的隐式或赋值强制转换,则必须提供
USING子句。
示例:如果旧数据类型为text,则需要USING 子句。如果是float,你不知道。
【讨论】:
根据PostgreSQL documentation,您可以使用语法float(n) 选择浮点数的最小数字,其中n 是二进制位数的最小数目,最多 53 个。
但是,要完全存储十进制值,请使用numeric(precision, scale) 或其同义词decimal(precision, scale),但请注意这些是硬限制;根据文档:
如果要存储的值的比例大于声明的 列的刻度,系统会将值四舍五入到指定的值 小数位数。那么,如果左边的位数 小数点超过声明的精度减去声明的 规模,引发错误。
因此您的更改表可能是:
ALTER TABLE meter_data
ALTER COLUMN w3pht TYPE numeric(10, 2)
USING (w3pht::numeric(10, 2));
小数点右边 2 位数字和总共 10 位数字。但是,如果你不
需要指定限制,简单的numeric将允许“小数点前最多131072位;后最多16383位”。
【讨论】: