# 数据类型介绍

URL: https://caijiao.org/postgresql/basic/objects/types
Source: docs/postgresql/basic/objects/types.md
Description: 详细介绍 PostgreSQL 支持的各种内建数据类型，包括数值、文本、时间、枚举、数组、自定义类型等。

## 数值类型

PostgreSQL 提供多种精度的数值类型，适用于不同的存储与计算需求。

| 类型     | 描述             | 示例值     |
|----------|------------------|------------|
| `smallint` | 2 字节整数       | 100        |
| `integer`  | 4 字节整数       | 100000     |
| `bigint`   | 8 字节整数       | 922337203 |
| `decimal` / `numeric` | 精确小数 | 1234.56    |
| `real`     | 单精度浮点数     | 3.14       |
| `double precision` | 双精度浮点 | 3.14159265 |

## 字符类型

用于存储文本数据，支持多语言与 Unicode。

| 类型       | 描述                     | 示例值        |
|------------|--------------------------|----------------|
| `char(n)`   | 定长字符串               | 'abc   '       |
| `varchar(n)`| 可变长，最多 n 个字符    | 'hello'        |
| `text`      | 无限长度字符串           | 'PostgreSQL'   |

> 建议使用 `text` 替代 `varchar`，除非有长度限制需求。

## 日期与时间类型

PostgreSQL 拥有强大的时间处理功能。

| 类型             | 描述                             | 示例值                      |
|------------------|----------------------------------|-----------------------------|
| `date`           | 日期                             | `2025-01-01`                |
| `timestamp`      | 无时区时间戳                     | `2025-01-01 12:34:56`       |
| `timestamptz`    | 带时区时间戳                     | `2025-01-01 12:34:56+08`    |
| `interval`       | 时间间隔                         | `1 day 2 hours`             |

## 布尔类型

```sql
-- 只允许 true/false 或 't'/'f'
is_active BOOLEAN DEFAULT true;
````

## 枚举类型

适合状态值等固定集合。

```sql
CREATE TYPE status AS ENUM ('pending', 'active', 'archived');

CREATE TABLE orders (
  id SERIAL,
  state status
);
```

## 数组类型

PostgreSQL 支持任意类型的数组。

```sql
tags TEXT[];
numbers INTEGER[];
```

## JSON 与 JSONB 类型

* `json`：保持原始结构，存储空间大，查询较慢
* `jsonb`：二进制格式，支持索引和高效查询

```sql
data JSONB NOT NULL;
```

## UUID 类型

用于唯一标识对象，推荐用于主键。

```sql
id UUID DEFAULT gen_random_uuid();
```

> 需启用 `pgcrypto` 扩展或使用 `uuid-ossp`

## 自定义类型

PostgreSQL 支持用户定义复杂类型，例如复合类型或域（domain）类型，增强结构表达能力。

## 小结

PostgreSQL 提供丰富且强大的数据类型系统，涵盖结构化、半结构化、多维数据等多种需求，极大增强了数据模型的表达能力。
