CodeGym /课程 /SQL SELF /数值数据类型: INTEGERNUMERIC

数值数据类型: INTEGERNUMERICFLOAT

SQL SELF
第 15 级 , 课程 1
可用

今天咱们聊聊PostgreSQL里的数值类型。如果你曾经纠结过怎么存“42”这种数字、搞财务计算或者存毫秒啥的——你来对地方了。咱们一起看看每种类型适合啥场景,让你和你的数据都能舒服地待着。

PostgreSQL里的数值类型分三大类:

  1. 整数(INTEGER:用来存没有小数部分的数字。就是那种1、42、-7这种老熟人。
  2. 精确数字(NUMERIC:用来存有固定小数位的数字。做财务计算的时候超有用,精度比命还重要。
  3. 浮点数(REAL:用来存特别大或者特别小的数字。它没NUMERIC那么精确,但做科学计算啥的很合适。

INTEGER类型

INTEGER就是用来存整数的类型。适合你只想存没有小数的数字。PostgreSQL给了你三种INTEGER,能覆盖不同的范围:

  • SMALLINT:小整数类型。范围:-32,768到32,767。
  • INTEGER(或者INT:标准整数类型。范围:-2,147,483,648到2,147,483,647。
  • BIGINT:大整数。范围:-9,223,372,036,854,775,808到9,223,372,036,854,775,807。

假设我们有个students表,存着学生的信息:名字、年龄和学分(学术积分):

id name age credits
1 Otto Nate 21 30
2 Maria Chi 22 45
3 Peter Val 20 60
4 Anna Song 23 50
5 Sophie Zhang 21 35

现在来个简单的SQL查询,查出学生的名字、年龄和学分:

SELECT name, age, credits
FROM students;

结果:

name age credits
Otto Nate 21 30
Maria Chi 22 45
Peter Val 20 60
Anna Song 23 50
Sophie Zhang 21 35

啥时候用INTEGER

  • 存id(id、订单号啥的)。
  • 存数量(比如库存数量、学生人数)。

NUMERIC类型

NUMERIC是用来存有固定小数位的精确数字。如果你要存123.456这种,哪怕小数点后一位错了都要掉头发(或者掉钱),那就用NUMERIC

声明格式:NUMERIC(precision, scale),其中:

  • precision——总位数(包括小数点前后的)。
  • scale——小数点后的位数。

比如NUMERIC(6, 2)能存最多6位数字,其中2位在小数点后。

来建个表,记录财务交易:

id description amount
1 学费支付 2345.67
2 每月奖学金 500.00
3 实验室费用 145.99
4 图书馆罚款 12.75
5 会议注册 320.50

现在查一下交易列表:

SELECT description, amount
FROM transactions;

结果:

description amount
学费支付 2345.67
每月奖学金 500.00
实验室费用 145.99
图书馆罚款 12.75
会议注册 320.50

啥时候用NUMERIC

  • 财务计算(商品价格、工资)。
  • 存精确测量(重量、长度)。

measurements

id mass - REAL height - REAL
1 70.5 1.83
2 64.2 1.75
3 82.3 1.92
4 55.0 1.60

现在查一下这些值:

SELECT mass, height
FROM measurements;

结果:

mass height
70.5 1.83
64.2 1.75
82.3 1.92
55.0 1.60

啥时候用REAL

  • 科学计算(原子质量、到月球的距离)。
  • 数据建模,允许有点误差的场景。

数值类型对比:啥时候用哪个?

数据类型 范围 精度 应用示例
SMALLINT -32,768到32,767 整数 小数字(年龄、评分)。
INTEGER -2,147,483,648到2,147,483,647 整数 id、数量。
BIGINT -9,223,372,036,854,775,808到9,223,372,036,854,775,807 整数 超大数字。
NUMERIC 取决于precisionscale 精确小数 财务、测量。
REAL 大约6位小数 浮点 大致或科学数据。
DOUBLE PRECISION 大约15位小数 高精度浮点 科学、研究。

别名

在PostgreSQL里,很多数值类型有别名(也叫同义词)——就是类型的另一个名字,行为一样,但有时候更好读,或者和别的数据库兼容。

下面是PostgreSQL里数值类型别名的简单指南:

整数类型的别名

别名 实际类型 大小 范围
INT INTEGER 4字节 −2,147,483,648到2,147,483,647
INT4 INTEGER 4字节 (老别名)
SMALLINT SMALLINT 2字节 −32,768到32,767
INT2 SMALLINT 2字节
BIGINT BIGINT 8字节 −9千万亿亿到+9千万亿亿
INT8 BIGINT 8字节

精确数字的别名

别名 实际类型 用途
DEC NUMERIC SQL标准同义词
DECIMAL NUMERIC 一样

浮点数的别名

别名 实际类型 精度
FLOAT DOUBLE PRECISION ~15位(默认)
FLOAT(24) REAL ~6位
FLOAT(53) DOUBLE PRECISION ~15位
FLOAT8 DOUBLE PRECISION 老别名
FLOAT4 REAL 老别名

常见错误

用数值类型的时候,有几个坑要注意:

选错数据类型。 比如你用SMALLINT存人的年龄,结果“黑客帝国”里的机器人几百万岁,直接溢出,机器人都不开心。

四舍五入丢数据。REAL做财务计算,分分都能丢,客户信任也没了。

不同类型比较。INTEGERREAL比,有时候结果会很迷,因为浮点数的存储方式有点玄学。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION