今天咱们聊聊PostgreSQL里的数值类型。如果你曾经纠结过怎么存“42”这种数字、搞财务计算或者存毫秒啥的——你来对地方了。咱们一起看看每种类型适合啥场景,让你和你的数据都能舒服地待着。
PostgreSQL里的数值类型分三大类:
- 整数(
INTEGER):用来存没有小数部分的数字。就是那种1、42、-7这种老熟人。 - 精确数字(
NUMERIC):用来存有固定小数位的数字。做财务计算的时候超有用,精度比命还重要。 - 浮点数(
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 |
取决于precision和scale |
精确小数 | 财务、测量。 |
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做财务计算,分分都能丢,客户信任也没了。
不同类型比较。 拿INTEGER和REAL比,有时候结果会很迷,因为浮点数的存储方式有点玄学。
GO TO FULL VERSION