PostgreSQL 数据类型
简介
PostgreSQL 提供了一套全面的数据类型,用于存储和操作各种类型的数据。理解这些数据类型对于设计高效的数据库架构和编写正确的 SQL 查询至关重要。
数据类型分类
PostgreSQL 数据类型分为以下几类:
- 数值类型 - 整数、浮点数、精确数字
- 字符类型 - 字符串、文本
- 日期/时间类型 - 日期、时间、时间戳
- 布尔类型 - 真/假值
- 二进制数据类型 - 二进制字符串
- JSON 类型 - 结构化数据
- UUID 类型 - 通用唯一标识符
- 数组类型 - 元素数组
- 枚举类型 - 自定义枚举值
- 几何类型 - 点、线、形状
- 网络地址类型 - IP 地址、MAC 地址
- 范围类型 - 值范围
数值类型
整数类型
SMALLINT 示例
INTEGER 示例
BIGINT 示例
序列类型(自增)
序列类型是 PostgreSQL 特有的自增类型:
浮点类型
精确数值类型
NUMERIC 和 DECIMAL 是具有用户指定精度的精确数值类型。
货币类型
MONEY 类型存储具有固定小数精度的货币金额。
注意:MONEY 类型依赖于区域设置。对于国际应用程序,请使用 NUMERIC。
字符类型
CHAR 示例
VARCHAR 示例
TEXT 示例
最佳实践:对于可变长度字符串,使用 TEXT,除非需要强制最大长度。
布尔类型
BOOLEAN 类型存储真/假值。
布尔值表示:
- TRUE:
TRUE、't'、'true'、'y'、'yes'、'on'、'1' - FALSE:
FALSE、'f'、'false'、'n'、'no'、'off'、'0'
日期/时间类型
DATE 示例
TIME 示例
TIMESTAMP 示例
TIMESTAMPTZ 示例
最佳实践:始终使用 TIMESTAMPTZ 存储时间戳以正确处理时区转换。
INTERVAL 示例
二进制数据类型
JSON 类型
PostgreSQL 支持两种 JSON 数据类型:JSON 和 JSONB(二进制 JSON)。
推荐:使用 JSONB 以获得更好的性能和索引能力。
JSON 示例
JSONB 示例
UUID 类型
UUID(通用唯一标识符)是 128 位标识符。
数组类型
PostgreSQL 允许将列定义为任何内置或用户定义类型的数组。
枚举类型
枚举类型是具有静态、有序值集的自定义数据类型。
几何类型
PostgreSQL 支持用于 2D 空间数据的各种几何类型。
几何数据类型表示二维的平面物体。
下表列出了 PostgreSQL 支持的几何类型。
最基本的类型:点。它是其它类型的基础。
网络地址类型
PostgreSQL 提供用于存储网络地址的数据类型。
范围类型
范围类型表示某个元素类型的值范围。
复合类型
您可以创建自定义复合类型(类似于结构体)。
XML 类型
PostgreSQL 支持存储和查询 XML 数据。
位串类型
位串是由 1 和 0 组成的字符串。
数据类型转换
PostgreSQL 提供了几种在数据类型之间转换的方法。
CAST 函数
:: 操作符(PostgreSQL 特有)
转换函数
选择正确的数据类型
最佳实践
-
使用适当的数值类型
- 对大多数整数使用 INTEGER
- 仅在需要时使用 BIGINT(节省空间)
- 对精确的十进制计算使用 NUMERIC(货币、测量)
- 避免对财务数据使用 REAL/DOUBLE PRECISION
-
字符串类型
- 对无限制的可变长度字符串使用 TEXT
- 仅在需要强制最大长度时使用 VARCHAR(n)
- 除非需要固定长度字符串,否则避免使用 CHAR(n)
-
日期/时间类型
- 始终对时间戳使用 TIMESTAMPTZ(处理时区)
- 对不带时间的日期使用 DATE
- 对持续时间使用 INTERVAL
-
布尔值 vs 整数
- 对真/假值使用 BOOLEAN(意图更清晰)
- 不要对布尔逻辑使用 INTEGER(0/1)
-
JSON 类型
- 优先使用 JSONB 而不是 JSON(更好的性能、索引)
- 对半结构化数据使用 JSONB
-
数组 vs 单独的表
- 对不需要查询的简单列表使用数组
- 对复杂关系使用单独的表
性能考虑
常见数据类型错误
错误 1:使用不带长度的 VARCHAR
错误 2:对货币使用 REAL
错误 3:不使用 SERIAL 进行自增
错误 4:将日期存储为字符串
错误 5:不使用 TIMESTAMPTZ
数据类型大小比较
总结
PostgreSQL 提供了丰富的数据类型集:
- 数值类型:INTEGER、BIGINT、NUMERIC、REAL、DOUBLE PRECISION
- 字符类型:CHAR、VARCHAR、TEXT
- 日期/时间类型:DATE、TIME、TIMESTAMP、TIMESTAMPTZ、INTERVAL
- 布尔类型:TRUE/FALSE 值
- 二进制类型:BYTEA 用于二进制数据
- JSON 类型:JSON 和 JSONB 用于结构化数据
- UUID:唯一标识符
- 数组:多值列
- 枚举:自定义枚举类型
- 几何类型:空间数据
- 网络类型:IP 和 MAC 地址
- 范围类型:值范围
关键要点:
- 为数据选择最小的适当类型
- 对精确的十进制计算使用 NUMERIC
- 始终对时间戳使用 TIMESTAMPTZ
- 优先使用 JSONB 而不是 JSON
- 使用 TEXT 而不是不带长度的 VARCHAR
- 使用适当的类型以获得更好的性能和数据完整性
理解并选择正确的数据类型是构建高效可靠的 PostgreSQL 数据库的基础。 CAST('123' AS INTEGER) AS int_value, CAST('2024-01-01' AS DATE) AS date_value, CAST(123.45 AS INTEGER) AS truncated, CAST('true' AS BOOLEAN) AS bool_value;
转换函数
选择正确的数据类型
最佳实践
-
使用适当的数值类型
- 对大多数整数使用 INTEGER
- 仅在需要时使用 BIGINT(节省空间)
- 对精确的十进制计算使用 NUMERIC(货币、测量)
- 避免对财务数据使用 REAL/DOUBLE PRECISION
-
字符串类型
- 对无限制的可变长度字符串使用 TEXT
- 仅在需要强制最大长度时使用 VARCHAR(n)
- 除非需要固定长度字符串,否则避免使用 CHAR(n)
-
日期/时间类型
- 始终对时间戳使用 TIMESTAMPTZ(处理时区)
- 对不带时间的日期使用 DATE
- 对持续时间使用 INTERVAL
-
布尔值 vs 整数
- 对真/假值使用 BOOLEAN(意图更清晰)
- 不要对布尔逻辑使用 INTEGER(0/1)
-
JSON 类型
- 优先使用 JSONB 而不是 JSON(更好的性能、索引)
- 对半结构化数据使用 JSONB
-
数组 vs 单独的表
- 对不需要查询的简单列表使用数组
- 对复杂关系使用单独的表
性能考虑
常见数据类型错误
错误 1:使用不带长度的 VARCHAR
错误 2:对货币使用 REAL
错误 3:不使用 SERIAL 进行自增
错误 4:将日期存储为字符串
错误 5:不使用 TIMESTAMPTZ
数据类型大小比较
总结
PostgreSQL 提供了丰富的数据类型集:
- 数值类型:INTEGER、BIGINT、NUMERIC、REAL、DOUBLE PRECISION
- 字符类型:CHAR、VARCHAR、TEXT
- 日期/时间类型:DATE、TIME、TIMESTAMP、TIMESTAMPTZ、INTERVAL
- 布尔类型:TRUE/FALSE 值
- 二进制类型:BYTEA 用于二进制数据
- JSON 类型:JSON 和 JSONB 用于结构化数据
- UUID:唯一标识符
- 数组:多值列
- 枚举:自定义枚举类型
- 几何类型:空间数据
- 网络类型:IP 和 MAC 地址
- 范围类型:值范围
关键要点:
- 为数据选择最小的适当类型
- 对精确的十进制计算使用 NUMERIC
- 始终对时间戳使用 TIMESTAMPTZ
- 优先使用 JSONB 而不是 JSON
- 使用 TEXT 而不是不带长度的 VARCHAR
- 使用适当的类型以获得更好的性能和数据完整性
理解并选择正确的数据类型是构建高效可靠的 PostgreSQL 数据库的基础。