在 PostgreSQL 中,数据类型的选择对于确保数据的正确存储和高效查询至关重要。PostgreSQL 支持广泛的数据类型,包括基本类型、复合类型、枚举类型、数组类型等。以下是 PostgreSQL 中一些常用的数据类型及其用途的详细说明:

基本数据类型

数值类型

  • 整数类型
    • smallint(2字节)
    • integer(4字节)
    • bigint(8字节)
  • 浮点类型
    • real(4字节)
    • double precision(8字节)
  • 精确数值类型
    • numeric(precision, scale)(可变长度)
    • decimal(precision, scale)(可变长度)
  • 货币类型
    • money(8字节)

字符串类型

  • 固定长度字符串
    • char(n)(n字节)
  • 变长字符串
    • varchar(n)(可变长度)
    • text(可变长度)

日期和时间类型

  • timestamp without time zone(8字节)
  • timestamp with time zone(8字节)
  • date(4字节)
  • time without time zone(8字节)
  • time with time zone(8字节)
  • interval(16字节)

布尔类型

  • boolean(1字节)

UUID 类型

  • uuid(16字节)

网络地址类型

  • inet(IPv4/IPv6 地址)
  • cidr(IPv4/IPv6 地址加子网掩码)
  • macaddr(MAC 地址)

几何类型

  • point(2维点)
  • line(线段)
  • lseg(线段)
  • box(矩形)
  • path(路径)
  • polygon(多边形)
  • circle(圆)

其他类型

  • bytea(二进制数据)
  • xml(XML 文档)
  • json(JSON 文档)
  • jsonb(二进制化的 JSON 文档)

复合类型

复合类型是由其他类型组合而成的类型。例如:

  • 记录类型
    • record(由字段组成的记录)
    • 自定义类型

枚举类型

枚举类型是一个包含一组命名值的类型。例如:

CREATE TYPE status AS ENUM ('active', 'inactive', 'suspended');

数组类型

数组类型可以是一维或多维数组。例如:

CREATE TABLE students (
    id integer PRIMARY KEY,
    name text[],
    grades real[]
);

自定义类型

除了标准类型外,PostgreSQL 还允许用户定义自己的数据类型。例如:

CREATE TYPE custom_type AS (field1 int, field2 text);

选择合适的数据类型

选择合适的数据类型时应考虑以下几个方面:

  • 数据范围:确保选择的数据类型能够容纳预期的数据范围。
  • 存储效率:不同类型占用的空间大小不同,选择更紧凑的类型可以节省存储空间。
  • 查询性能:某些类型在某些操作上比其他类型更快。
  • 数据完整性:选择能够正确表达数据语义的数据类型,有助于维护数据的完整性和一致性。
  • 兼容性和可移植性:如果需要与其他系统交互,应选择兼容性好的数据类型。

示例

以下是一个包含多种数据类型的表的创建示例:

CREATE TABLE users (
    id serial PRIMARY KEY,
    first_name varchar(50) NOT NULL,
    last_name varchar(50) NOT NULL,
    email varchar(100) UNIQUE NOT NULL,
    birth_date date,
    created_at timestamp with time zone DEFAULT now(),
    active boolean DEFAULT true,
    address jsonb,
    roles text[] DEFAULT ARRAY['user'],
    status status -- 假设 status 是一个枚举类型
);

在这个示例中,表 users 包含了整数、字符串、日期时间、布尔值、JSONB、数组和枚举类型等多种数据类型。

正确选择和使用数据类型是构建高性能和可靠数据库的关键。希望上述信息对你有所帮助!如果你有特定的需求或问题,请随时提问。