PostgreSQL 数据类型

2025年3月17日 | 阅读 10 分钟

数据类型指定您希望在表字段中存储什么类型的数据。创建表时,您必须为每个列使用数据类型。它标识特定类型的数据,如整数、布尔值、浮点数等。

在本节中,我们将讨论 PostgreSQL 中使用的各种数据类型。

PostgreSQL 中,每个数据库表都有许多列,并且每个列都有精确的数据类型。它支持广泛的数据类型。

此外,用户可以使用 CREATE TYPE SQL 命令创建自己的自定义数据类型。这些数据类型具有以下优点:

  • 性能:如果正确有效地使用这些数据类型来存储数据值,它会提高我们的性能。
  • 验证:正确使用数据类型涉及数据验证和拒绝超出数据类型范围的数据。
  • 紧凑性:它存储效率高,因为一个列可以存储单一类型的值。
  • 一致性:针对相同数据类型列的操作提供可靠的结果,并且通常是最快的。

在 PostgreSQL 中,我们有许多组数据类型;让我们逐一了解它们:

PostgreSQL Data Types
  • 数字数据类型
  • 字符数据类型
  • 日期/时间数据类型
  • 货币数据类型
  • 二进制数据类型
  • 布尔数据类型
  • 枚举数据类型
  • 几何数据类型
  • 文本搜索数据类型
  • UUID 数据类型
  • 网络地址类型
  • JSON 数据类型
  • 位串类型
  • XML 数据类型
  • 范围数据类型
  • 数组
  • 复合数据类型
  • 对象标识符类型
  • 伪数据类型
  • pg-Isn 数据类型

数值数据类型

数字数据类型用于在表中指定数字数据。它包含以下内容:

  • 四字节和八字节浮点数
  • 两字节、四字节和八字节整数
  • 可选精度的十进制数.

下表包含 PostgreSQL 支持的所有数字数据类型:

name描述存储大小range
smallint存储整数,范围小。2 字节-32768 至 +32767
整数存储整数。当您想存储典型整数时使用。4 字节-2147483648 到 +2147483647
bigint存储整数,范围大。8 字节-9223372036854775808 到 9223372036854775807
decimal用户指定精度,精确variable (变量)小数点前最多 131072 位;小数点后最多 16383 位。
numeric用户指定精度,精确variable (变量)
小数点前最多 131072 位;小数点后最多 16383 位。
real
可变精度,不精确
4 字节6 位十进制精度。
double precision可变精度,不精确8 字节15 位十进制精度
serial自动递增整数4 字节1 到 2147483647
bigserial大型自动递增整数8 字节1 到 9223372036854775807

字符数据类型

在 PostgreSQL 中,我们有各种通用字符数据类型,这些数据类型用于表示字符类型的值。

下表包含 PostgreSQL 支持的所有字符数据类型:

数据类型说明
char(size)
此处 size 是要存储的字符数。定长字符串。右侧用空格填充以达到 size 字符。
character(size)此处 size 是要存储的字符数。定长字符串。右侧用空格填充以达到 size 字符。
varchar(size)此处 size 是要存储的字符数。变长字符串。
character varying(size)此处 size 是要存储的字符数。变长字符串。
text变长字符串。

日期/时间数据类型

PostgreSQL 支持完整的 SQL 日期和时间数据类型集。日期/时间数据类型用于表示使用日期和时间值的列。日期是根据公历计算的。

下表包含 PostgreSQL 支持的所有日期/时间数据类型:

名称描述存储大小最小值最大值决议
timestamp [ (p) ] [ without time zone ]日期和时间(无时区)8 字节公元前 4713 年公元 294276 年1 微秒 / 14 位数字
timestamp [ (p) ] with time zone日期和时间,带时区8 字节公元前 4713 年公元 294276 年1 微秒 / 14 位数字
datedate (无时间)4 字节公元前 4713 年公元 5874897 年1 天
time [ (p) ] [ without time zone ]时间(无日期)8 字节00:00:0024:00:001 微秒 / 14 位数字
time [ (p) ] with time zone仅时间,带时区12 字节00:00:00+145924:00:00-14591 微秒 / 14 位数字
interval [ fields ] [ (p) ]时间间隔12 字节-178000000 年178000000 年1 微秒 / 14 位数字

货币类型

名称描述存储大小范围
money货币金额8 字节-92233720368547758.08 到 +92233720368547758.07

二进制数据类型

bytea 数据类型允许存储二进制字符串,如下表所示:

名称存储大小描述
bytea1 或 4 字节加上实际的二进制字符串变长二进制字符串

布尔类型

PostgreSQL 包含标准 SQL 类型 boolean;布尔类型有多种状态,如 true、false,以及第三种状态 unknown,由 SQL null 值表示。

名称描述存储大小
boolean它指定真或假的状态。1 字节

布尔数据类型输入函数接收这些字符串表示形式用于 true 和 false 状态。

PostgreSQL Data Types

枚举类型

在 PostgreSQL 中,枚举数据类型包含一组静态、有序的值。

它类似于与各种编程语言兼容的 enum 类型。枚举数据类型在表中以外键表示,以确保数据完整性。

例如

几何数据类型

几何数据类型表示二维空间对象。最基本的类型是点,它构成了所有其他类型的基础。

名称存储大小表示描述
point16 字节平面上的点(x,y)
序列32 字节无限线(未完全实现)((x1,y1),(x2,y2))
lseg32 字节有限线段((x1,y1),(x2,y2))
box32 字节矩形框((x1,y1),(x2,y2))
path16+16n 字节闭合路径(类似于多边形)((x1,y1),...)
path16+16n 字节开放路径[(x1,y1),...]
polygon40+16n多边形(类似于闭合路径)((x1,y1),...)
circle24 字节circle<(x,y),r>(中心点和半径)

文本搜索数据类型

在 PostgreSQL 中,全文搜索数据类型用于在自然语言文档集合中进行搜索。我们有两种与全文搜索兼容的数据类型。

数据类型描述
tsvector它用于以增强文本搜索的形式显示文档。
tsquery它用于表示文本查询。

UUID 数据类型

UUID 代表通用唯一标识符,是由算法创建的 128 位数量。它是主键的最佳数据类型。UUID 以小写十六进制数字组的形式书写,通过连字符分隔的多个集合。

例如:

注意:PostgreSQL 也接受其他形式的 UUID 输入,例如无连字符、全大写、大括号等。

网络地址数据类型

PostgreSQL 提供数据类型来存储 Mac 地址、IPv4 和 IPv6,如下表所示。除了纯文本类型,它还增强了这些类型以包含网络地址,因为它们提供了输入错误检查和特定功能和操作符。

下表包含 PostgreSQL 支持的所有网络地址数据类型:

数据类型描述存储大小
inet它存储 IPv4 和 IPv6 主机和网络。7 或 19 字节
cidr它用于存储 IPv4 和 IPv6 网络。7 或 19 字节
macaddr它存储 MAC 地址。6 字节

JSON 数据类型

PostgreSQL 提供两种数据类型来存储 JSON(JavaScript 对象表示法)数据。

  • JSON
  • JSONB

Json

它是带有 JSON 验证的文本数据类型的扩展。在此,我们可以快速插入数据,但数据检索相对较慢。它按照包含空格的方式保存输入数据。它还需要在数据检索时进行重新处理。

Jsonb

它是 JSON 数据的二进制表示。它也兼容索引,并且还改进了空格以加快检索速度。在此,插入速度慢,但数据检索速度更快,并且在数据检索时不需要重新处理。

位串类型

位串数据类型包含两类字符串,即 1 和 0。借助这些字符串可以存储位掩码。在此,我们有两种 SQL 位,例如:

  • bit varying(n)
  • bit (n)

此处,n 是一个正整数。

XML 类型

在 PostgreSQL 中,XML 数据类型用于存储 XML 数据。XML 数据类型的功能是检查输入 XML 是否格式良好,并且还支持函数对其执行类型安全操作。

例如

范围类型

这些数据类型用于显示某些元素类型的范围值,称为范围的子类型。它还表示单个范围值中的多个元素值。在此,我们还可以创建自己的范围类型。

在 PostgreSQL 中,我们有以下内置范围类型:

内置范围类型描述
tsrange无时区时间戳范围
tstzrange带时区时间戳范围
daterange日期范围
int4range整数范围
int8range大整数范围
numrange数字范围

数组类型

在此,PostgreSQL 将表列作为可变长度和多维数组提供。我们可以创建任何用户定义的基类型、内置类型、复合类型和枚举类型数组。

在此,我们可以对数组执行各种操作,例如声明、插入、访问、修改和搜索。

复合类型

在 PostgreSQL 中,复合数据类型用于表示行或记录的结构,作为文件名字和数据类型的列表。

伪数据类型

在 PostgreSQL 中,数据类型是伪类型,用于包含许多特殊用途的条目。它用于声明结果类型或函数的参数,但它不兼容用作列数据类型。

下表包含 PostgreSQL 支持的一些常用数据类型:

伪数据类型描述
any它表示函数接受任何输入数据类型。
anyelement它接受任何数据类型。
anyarray它表示函数接受任何数组数据类型
anyenum它接受任何枚举数据类型
anyrange它接受任何范围数据类型
cstring它用于指定函数接受或返回以 null 结尾的 C 字符串。
language_handler声明过程语言调用处理程序返回 language_handler。
fdw_handler声明 fdw(外部数据封装器)处理程序返回 fdw_handler。
record它用于指定一个函数,该函数接受或返回未指定的行类型。
trigger它被声明为返回 trigger。
pg_ddl_command它用于表示可用于事件触发器的 DDL 命令。
void它用于指定函数不返回值。

对象标识符 (OIDs) 类型

这些数据类型用作几个系统表的主键。oid 类型表示对象标识符,当前实现为无符号四字节整数。在大型数据库甚至大型单个表中,它不足以提供全数据库的唯一性。

对象标识符用于引用系统表。除了比较,oid 类型本身很少有操作可以转换为整数,并且可以使用标准整数运算符进行操作。

下表包含 PostgreSQL 支持的所有对象标识符数据类型:

名称描述引用值示例
oid数字对象标识符Any564182
regproc函数名pg_proc求和
regprocedure带参数类型的函数pg_procsum(int4)
regoper操作符名pg_operator+
regoperator带参数类型的操作符pg_operator*(integer,integer) 或 -(NONE,integer)
regclass关系名pg_classpg_type
regtype数据类型名称pg_typeInteger
regnamespace命名空间名称pg_namespacepg_catalog
regconfig文本搜索配置pg_ts_config英文
regdictionary文本搜索字典pg_ts_dict简单

pg_lsn 类型

pg_lsn 数据类型可用于存储日志序列号 (LSN) 数据,它是 XLOG 中某个位置的指针。它用于表示 XLogRecPtr 和 PostgreSQL 的内部系统类型。pg_lsn 类型兼容标准比较运算符,例如 > 和 =.

注意

使用数据类型时,我们可以参考以下几点:

  • 如果我们有 IEEE 754 数据源,我们可以使用 float 数据类型
  • 对于整数数据类型,我们可以使用 int
  • 永远不要使用 char
  • 如果我们要限制输入,我们可以应用 text 数据类型。
  • 当数字很大时,我们只能使用 bigint

概述

  • 字符数据类型用于存储文本值。
  • 网络地址类型用于优化网络数据的存储。
  • 二进制字符串是字节或八位字节的分类。
  • PostgreSQL 提供两种不同类型的数字,例如浮点数和整数
  • 范围数据类型用于显示某些元素类型的范围值。
  • 布尔数据类型有三个值,例如 True、False 和 Null。
  • UUID 数据类型是一个由算法创建的 128 位数量。
  • 复合数据类型用于表示行或记录的结构。
  • PostgreSQL 中的枚举数据类型很少用于演示修改后的信息,如分支 ID 或国家代码。
  • 为了以多种格式定义日期和时间信息,PostgreSQL 提供了日期和时间数据类型。
  • 对象标识符数据类型表示对象标识符。
  • PostgreSQL 设计的文本搜索数据用于支持全文搜索。
  • 几何数据类型用于表示二维空间对象。
  • 在 PostgreSQL 中,伪类型用于许多特殊用途的条目。
  • pg_lsn 数据类型用于存储日志序列号 (LSN) 数据。