pg数据类型

好的,这是 PostgreSQL 中常用数据类型的整理表格。

### PostgreSQL 常用数据类型速查表

| 类型名称 | 存储空间 | 别名 | 数据范围 | 类型说明 | 数据样例 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **整数类型** | | | | | |
| `SMALLINT` | 2 字节 | `INT2` | -32,768 到 +32,767 | 小范围整数 | `30000`, `-2500` |
| `INTEGER` | 4 字节 | `INT`, `INT4` | -2,147,483,648 到 +2,147,483,647 | 常用的整数,性能好 | `2147483647`, `-1000000` |
| `BIGINT` | 8 字节 | `INT8` | -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 | 大范围整数 | `9223372036854775807` |
| `SMALLSERIAL` | 2 字节 | `SERIAL2` | 1 到 32,767 | 自增小整数(自动创建序列) | `1`, `2`, `3`, ... |
| `SERIAL` | 4 字节 | `SERIAL4` | 1 到 2,147,483,647 | 自增整数(自动创建序列) | `1`, `2`, `3`, ... |
| `BIGSERIAL` | 8 字节 | `SERIAL8` | 1 到 9,223,372,036,854,775,807 | 自增大整数(自动创建序列) | `1`, `2`, `3`, ... |
| **精确小数类型** | | | | | |
| `DECIMAL(p,s)` | 可变 | `NUMERIC(p,s)` | 小数点前最多131072位;小数点后最多16383位 | **精确**的定点数,推荐用于金融金额 | `1234.56` (p=6,s=2) |
| `NUMERIC(p,s)` | 可变 | `DECIMAL(p,s)` | 同 `DECIMAL` | 同 `DECIMAL`,两者完全一样 | `0.1230` (p=5,s=4) |
| **浮点数类型** | | | | | |
| `REAL` | 4 字节 | `FLOAT4` | 6位十进制精度,范围约 1E-37 到 1E+37 | **不精确**的单精度浮点数 | `3.4028235E+38`, `1.17549e-38` |
| `DOUBLE PRECISION` | 8 字节 | `FLOAT8` | 15位十进制精度,范围约 1E-307 到 1E+308 | **不精确**的双精度浮点数 | `2.2250738585072014e-308`, `1.7976931348623157e+308` |
| **字符串类型** | | | | | |
| `CHARACTER(n)` | `n` 字节 (空白填充) | `CHAR(n)` | 1 到 10,485,760 字节 | 定长字符串,不足补空白 | `'abc '` (n=5) |
| `CHARACTER VARYING(n)` | 实际字符串长度+4字节 | `VARCHAR(n)` | 1 到 10,485,760 字节 | 变长字符串,有长度限制 | `'abc'` (n=255) |
| `TEXT` | 实际字符串长度+4字节 | - | 无限制 (最大 1GB) | 变长字符串,**无长度限制** | `'这是一个非常长的文本...'` |
| **日期/时间类型** | | | | | |
| `DATE` | 4 字节 | - | 公元前4713年到公元5874897年 | 只存储日期(年月日) | `'2023-10-27'` |
| `TIME` | 8 字节 | - | 00:00:00 到 24:00:00 | 只存储一天中的时间(时分秒) | `'15:39:42.123456'` |
| `TIMESTAMP` | 8 字节 | - | 公元前4713年到公元294276年 | 存储日期和时间(无时区) | `'2023-10-27 15:39:42.123456'` |
| `TIMESTAMPTZ` | 8 字节 | `TIMESTAMP WITH TIME ZONE` | 同 `TIMESTAMP` | 存储日期和时间(**带时区**) | `'2023-10-27 15:39:42.123456+08'` |
| `INTERVAL` | 16 字节 | - | -178000000 年到 178000000 年 | 存储一段时间间隔 | `'1 day 02:00:00'`, `'3 months'` |
| **布尔类型** | | | | | |
| `BOOLEAN` | 1 字节 | `BOOL` | `true` / `false` | 逻辑布尔值(真/假) | `true`, `false`, `'t'`, `'f'`, `'yes'`, `'no'`, `'1'`, `'0'` |
| **网络地址类型** | | | | | |
| `INET` | 7 或 19 字节 | - | IPv4 和 IPv6 地址 | 存储主机或网络地址 | `'192.168.1.1/24'`, `'::1/128'` |
| `CIDR` | 7 或 19 字节 | - | IPv4 和 IPv6 网络 | 存储网络地址(无主机位) | `'192.168.1.0/24'` |
| `MACADDR` | 6 字节 | - | MAC 地址 | 存储MAC地址 | `'08:00:2b:01:02:03'` |
| `MACADDR8` | 8 字节 | - | EUI-64 MAC 地址 | 存储EUI-64格式MAC地址 | `'08:00:2b:ff:fe:01:02:03'` |
| **JSON 类型** | | | | | |
| `JSON` | 可变 | - | 无限制 (最大 1GB) | 存储原样JSON数据(**不验证**) | `'{"name": "John", "age": 30}'` |
| `JSONB` | 可变 | - | 无限制 (最大 1GB) | 存储二进制JSON数据(**已解析验证**,**推荐**) | `'{"age": 30, "name": "John"}'` |
| **特殊类型** | | | | | |
| `UUID` | 16 字节 | - | 128位 | 全局唯一标识符 | `'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'` |
| `BYTEA` | 可变 (1或4字节+实际字节数) | - | 1 到 1GB | 存储二进制数据(字节数组) | `'\xDEADBEEF'` |
| `ARRAY` | 可变 | - | 依赖于元素类型 | 可变长数组,可多维 | `{1,2,3}`, `{{"a","b"},{"c","d"}}` |

---

### 关键选择建议:

1. **整数**:常规用途用 `INTEGER` (INT),极大数值用 `BIGINT`,主键自增用 `SERIAL` 或 `BIGSERIAL`。
2. **小数**:**精确计算(尤其是金额)用 `DECIMAL/NUMERIC`**;科学计算、范围比精度更重要时用 `DOUBLE PRECISION`。
3. **字符串**:**几乎总是用 `TEXT`**,除非有明确的固定长度需求才用 `CHAR(n)`,或有明确的较短长度限制用 `VARCHAR(n)`。
4. **时间**:**几乎总是用 `TIMESTAMPTZ`** (带时区的时间戳),除非你非常确定不需要处理时区。
5. **JSON**:**几乎总是用 `JSONB`**,因为它支持索引且查询性能更高。只有需要完全保留原始格式(如空格、键顺序)时才用 `JSON`。
6. **布尔值**:直接用 `BOOLEAN`。

 

常用::进行类型转换:

SELECT some_text_column::numeric FROM my_table;
 也支持cast语法:
SELECT CAST('123' AS INTEGER);
 

 

posted @ 2025-12-12 14:41  ---江北  阅读(0)  评论(0)    收藏  举报
TOP