如何恢复表中已转为科学计数法的double precision类型原始数值
问题解决方案
你遇到的科学计数法问题本质包含两层原因:
double precision作为浮点类型,PostgreSQL默认在数值长度超过阈值时会自动用科学计数法展示,这属于显示层面的转换,精度范围内的存储数值本身没有丢失- 若你的原始数值有效位数超过15位,
double precision本身的精度限制会导致存储时就损失精度,这种情况无法恢复原始值
现有double类型列的显示调整
- 临时调整当前会话的显示格式,执行SQL即可让查询结果输出十进制格式:
SET float8_output = 'decimal';
- 若需要永久生效,可在PostgreSQL配置文件
postgresql.conf中添加float8_output = 'decimal',重启数据库后生效;也可直接针对指定库/用户做全局配置:
ALTER DATABASE 你的数据库名 SET float8_output = 'decimal';
永久保留原始数值的方案
如果要从根源避免科学计数法问题、同时保证数值精度不丢失,建议根据使用场景替换列的数据类型:
- 若存储的都是整数,且数值范围在
-9223372036854775808~9223372036854775807之间,选择bigint类型:
ALTER TABLE demo ALTER COLUMN "values" TYPE bigint USING "values"::bigint;
- 若存储的是小数、或者整数超出bigint范围,选择精确数值类型
numeric(支持任意精度):
ALTER TABLE demo ALTER COLUMN "values" TYPE numeric USING "values"::numeric;
- 若该字段不需要做数值计算,仅作为标识存储,可直接使用字符串类型
varchar,完全保留输入的原始格式。
注意:如果你的原始数值有效位数超过15位,已经存储在double中的数据已经损失了精度,改类型前建议用原始数据源重新导入,确保数值正确。
内容的提问来源于stack exchange,提问作者dsg1810
相关产品推荐
相关产品推荐

