您的位置: 首页 - 知识教程 - Postgresql中real类型golang和python差异问题

Postgresql中real类型golang和python差异问题

来源:知识教程 / 时间: 2024-12-12

real,double precision不精确类型:

为什么说不精确呢?因为数据类型成功插入后,查询出来值可能和你插入的值不一样,原因是长度截断和四舍五入。

不精确现象

create table f1 (a real);
insert into f1 values (12.359);
insert into f1 values (12.359000205993652);
insert into f1 values (12.549);
insert into f1 values (12.548999786376953);
insert into f1 values (1234.234619140625);
-- 查询
select * from f1

  • sql查询结果
12.359
12.359
12.549
12.549
1234.2346
  • python代码
import psycopg
from psycopg.rows import dict_row

db = psycopg.connect("postgresql://postgres@127.0.0.1:5432/postgres")

cur = db.cursor(row_factory=dict_row)
cur.execute("select * from f1")
res = cur.fetchall()
cur.close()
for f in res:
    print(f)

python结果(和sql查询一致)

{'a': 12.359}
{'a': 12.359}
{'a': 12.549}
{'a': 12.549}
{'a': 1234.2346}

golang代码


golang结果

Postgresql的数值类型:

数值类型由 2 字节、4 字节或 8 字节的整数以及 4 字节或 8 字节的浮点数和可选精度的十进制数组成。 表 8-2列出了所有可用类型。

名字存储长度描述范围
smallint2 字节小范围整数-32768 到 +32767
integer4 字节常用的整数-2147483648 到 +2147483647
bigint8 字节大范围整数-9223372036854775808 到 +9223372036854775807
decimal可变长用户指定的精度,精确小数点前 131072 位;小数点后 16383 位
numeric可变长用户指定的精度,精确小数点前 131072 位;小数点后 16383 位
real4 字节可变精度,不精确6 位十进制数字精度
double precision8 字节可变精度,不精确15 位十进制数字精度
smallserial2 字节2 字节自增的小范围整数(1 到 32767)
serial4 字节自增整数1 到 2147483647
bigserial8 字节自增的大范围整数1 到 9223372036854775807

其中提供四类浮点型,其中两类完全相同decimal、numeric;按功能看可以分成两类:

  • 精确型:decimal,numeric
  • 不精确型:real,double precision

精确类型不会发生截断且如果超长了直接报错,主要插入成功了,查出来的一定等于插入的结果。
real:【不精确类型】【定长类型】PG10:六位有效数字,会四舍五入(PG14八位有效数字)


返回顶部