1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG012-PG数据类型入门:常用基础类型(数值/字符/日期)

本文详细介绍PostgreSQL数据库中常用的基础数据类型,包括数值类型、字符类型和日期/时间类型,以及它们的使用场景和示例。风哥教程参考PostgreSQL官方文档Data Types部分。

本文档风哥主要介绍PostgreSQL教程012相关内容。风哥教程参考PostgreSQL官方文档Server Administration, SQL Language内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 PostgreSQL数据类型概述

PostgreSQL支持丰富的数据类型,包括基本数据类型和复合数据类型。选择合适的数据类型对于数据库的性能和数据完整性至关重要。学习交流加群风哥微信: itpux-com

1.2 PostgreSQL数据类型分类

PostgreSQL的数据类型主要分为以下几类:

from oracle:www.itpux.com

  • 数值类型:整数、浮点数、定点数等
  • 字符类型:定长字符、变长字符、文本等
  • 日期/时间类型:日期、时间、时间戳、间隔等
  • 布尔类型:true/false
  • 枚举类型:自定义枚举值
  • 位串类型:固定长度或可变长度的位串
  • 二进制数据类型:二进制数据
  • 网络地址类型:IP地址、MAC地址等
  • 几何类型:点、线、圆等
  • JSON类型:JSON数据
  • 数组类型:数组
  • 复合类型:自定义复合类型
  • 范围类型:范围值
  • 其他特殊类型:UUID、XML等
风哥教程针对风哥教程针对风哥教程针对生产环境建议:选择合适的数据类型可以提高数据库性能,减少存储空间,确保数据完整性。应根据实际数据需求选择最适合的数据类型。学习交流加群风哥QQ113257174

Part02-数值类型

2.1 整数类型

整数类型用于存储整数值,PostgreSQL提供了多种整数类型,适用于不同范围的整数值。

— 创建包含整数类型的表
CREATE TABLE fgedu_employees (
employee_id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age SMALLINT CHECK (age >= 18),
salary INTEGER NOT NULL,
employee_number BIGINT UNIQUE
);

— 插入数据
INSERT INTO fgedu_employees (name, age, salary, employee_number) VALUES
(‘风哥1号’, 25, 8000, 10000000000),
(‘风哥2号’, 30, 12000, 10000000001),
(‘王五’, 28, 10000, 10000000002);

— 查询数据
SELECT * FROM fgedu_employees;
employee_id | name | age | salary | employee_number
————-+——+—–+——–+——————
1 | 风哥1号 | 25 | 8000 | 10000000000
2 | 风哥2号 | 30 | 12000 | 10000000001
3 | 王五 | 28 | 10000 | 10000000002
(3 rows)

2.2 浮点类型

浮点类型用于存储带小数点的数值,PostgreSQL提供了两种浮点类型:real和double precision。

— 创建包含浮点类型的表
CREATE TABLE fgedu_products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
weight REAL,
price DOUBLE PRECISION NOT NULL
);

— 插入数据
INSERT INTO fgedu_products (product_name, weight, price) VALUES
(‘PostgreSQL数据库实战’, 0.85, 89.90),
(‘Python编程基础’, 0.65, 59.90),
(‘Java核心技术’, 1.20, 139.90);

— 查询数据
SELECT * FROM fgedu_products;
product_id | product_name | weight | price
————+———————-+——–+——-
1 | PostgreSQL数据库实战 | 0.85 | 89.9
2 | Python编程基础 | 0.65 | 59.9
3 | Java核心技术 | 1.2 | 139.9
(3 rows)

2.3 定点类型

定点类型用于存储精确的小数,PostgreSQL提供了numeric类型。

— 创建包含定点类型的表
CREATE TABLE fgedu_finances (
transaction_id SERIAL PRIMARY KEY,
transaction_date DATE NOT NULL,
amount NUMERIC(10, 2) NOT NULL,
tax NUMERIC(8, 4) NOT NULL
);

— 插入数据
INSERT INTO fgedu_finances (transaction_date, amount, tax) VALUES
(‘2026-04-01’, 1000.50, 80.0400),
(‘2026-04-02’, 2500.75, 200.0600),
(‘2026-04-03’, 500.25, 40.0200);

— 查询数据
SELECT * FROM fgedu_finances;
transaction_id | transaction_date | amount | tax
—————-+——————+———+———
1 | 2026-04-01 | 1000.50 | 80.0400
2 | 2026-04-02 | 2500.75 | 200.0600
3 | 2026-04-03 | 500.25 | 40.0200
(3 rows)

2.4 序列类型

序列类型用于生成唯一的整数序列,PostgreSQL提供了三种序列类型:smallserial、serial和bigserial。

— 创建包含序列类型的表
CREATE TABLE fgedu_orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL,
order_date TIMESTAMP NOT NULL DEFAULT NOW()
);

— 插入数据(自动生成order_id)
INSERT INTO fgedu_orders (customer_id) VALUES (1), (2), (3);

— 查询数据
SELECT * FROM fgedu_orders;
order_id | customer_id | order_date
———-+————-+——————————-
1 | 1 | 2026-04-02 16:30:00.123456+08
2 | 2 | 2026-04-02 16:30:00.123456+08
3 | 3 | 2026-04-02 16:30:00.123456+08
(3 rows)

Part03-字符类型

3.1 定长字符类型

定长字符类型用于存储固定长度的字符串,PostgreSQL提供了char(n)类型。

— 创建包含定长字符类型的表
CREATE TABLE fgedu_customers (
customer_id SERIAL PRIMARY KEY,
customer_code CHAR(10) UNIQUE NOT NULL,
name VARCHAR(50) NOT NULL
);

— 插入数据
INSERT INTO fgedu_customers (customer_code, name) VALUES
(‘C000000001’, ‘风哥1号’),
(‘C000000002’, ‘风哥2号’),
(‘C000000003’, ‘王五’);

— 查询数据
SELECT * FROM fgedu_customers;
customer_id | customer_code | name
————-+—————+——
1 | C000000001 | 风哥1号
2 | C000000002 | 风哥2号
3 | C000000003 | 王五
(3 rows)

3.2 变长字符类型

变长字符类型用于存储可变长度的字符串,PostgreSQL提供了varchar(n)类型。

— 创建包含变长字符类型的表
CREATE TABLE fgedu_products (
product_id SERIAL PRIMARY KEY,
product_code VARCHAR(20) UNIQUE NOT NULL,
product_name VARCHAR(100) NOT NULL,
description VARCHAR(500)
);

— 插入数据
INSERT INTO fgedu_products (product_code, product_name, description) VALUES
(‘PG-1001’, ‘PostgreSQL数据库实战’, ‘PostgreSQL数据库从入门到精通,适合初学者和有经验的数据库管理员’),
(‘PY-1001’, ‘Python编程基础’, ‘Python语言入门教程,涵盖基本语法和常用库’),
(‘JA-1001’, ‘Java核心技术’, ‘Java语言高级编程,包括面向对象编程和多线程编程’);

— 查询数据
SELECT * FROM fgedu_products;
product_id | product_code | product_name | description
————+————–+———————-+——————————————————-
1 | PG-1001 | PostgreSQL数据库实战 | PostgreSQL数据库从入门到精通,适合初学者和有经验的数据库管理员
2 | PY-1001 | Python编程基础 | Python语言入门教程,涵盖基本语法和常用库
3 | JA-1001 | Java核心技术 | Java语言高级编程,包括面向对象编程和多线程编程
(3 rows)

3.3 文本类型

文本类型用于存储任意长度的字符串,PostgreSQL提供了text类型。

— 创建包含文本类型的表
CREATE TABLE fgedu_articles (
article_id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);

— 插入数据
INSERT INTO fgedu_articles (title, content) VALUES
(‘PostgreSQL数据类型详解’, ‘本文详细介绍了PostgreSQL数据库支持的各种数据类型,包括数值类型、字符类型、日期/时间类型等。通过学习本文,读者可以了解如何选择合适的数据类型来存储不同类型的数据…’,
‘Python编程最佳实践’, ‘Python是一种强大的编程语言,具有简洁明了的语法和丰富的库。本文介绍了Python编程的最佳实践,包括代码风格、性能优化、错误处理等方面的内容…’);

— 查询数据
SELECT article_id, title, LENGTH(content) AS content_length FROM fgedu_articles;
article_id | title | content_length
————+—————————+—————-
1 | PostgreSQL数据类型详解 | 256
2 | Python编程最佳实践 | 234
(2 rows)

Part04-日期/时间类型

4.1 日期类型

日期类型用于存储日期值,PostgreSQL提供了date类型。

— 创建包含日期类型的表
CREATE TABLE fgedu_events (
event_id SERIAL PRIMARY KEY,
event_name VARCHAR(100) NOT NULL,
event_date DATE NOT NULL
);

— 插入数据
INSERT INTO fgedu_events (event_name, event_date) VALUES
(‘技术分享会’, ‘2026-04-10’),
(‘产品发布会’, ‘2026-04-15’),
(‘团队建设活动’, ‘2026-04-20’);

— 查询数据
SELECT * FROM fgedu_events;
event_id | event_name | event_date
———-+————+————
1 | 技术分享会 | 2026-04-10
2 | 产品发布会 | 2026-04-15
3 | 团队建设活动 | 2026-04-20
(3 rows)

— 查询即将到来的活动
SELECT * FROM fgedu_events WHERE event_date >= CURRENT_DATE;
event_id | event_name | event_date
———-+————+————
1 | 技术分享会 | 2026-04-10
2 | 产品发布会 | 2026-04-15
3 | 团队建设活动 | 2026-04-20
(3 rows)

4.2 时间类型

时间类型用于存储时间值,PostgreSQL提供了time和time with time zone类型。

— 创建包含时间类型的表
CREATE TABLE fgedu_schedules (
schedule_id SERIAL PRIMARY KEY,
activity VARCHAR(100) NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL
);

— 插入数据
INSERT INTO fgedu_schedules (activity, start_time, end_time) VALUES
(‘晨练’, ’07:00:00′, ’08:00:00′),
(‘工作’, ’09:00:00′, ’18:00:00′),
(‘学习’, ’19:00:00′, ’21:00:00′);

— 查询数据
SELECT * FROM fgedu_schedules;
schedule_id | activity | start_time | end_time
————-+———-+————+———-
1 | 晨练 | 07:00:00 | 08:00:00
2 | 工作 | 09:00:00 | 18:00:00
3 | 学习 | 19:00:00 | 21:00:00
(3 rows)

— 查询当前正在进行的活动
SELECT * FROM fgedu_schedules WHERE start_time <= CURRENT_TIME AND end_time >= CURRENT_TIME;
schedule_id | activity | start_time | end_time
————-+———-+————+———-
2 | 工作 | 09:00:00 | 18:00:00
(1 row)

4.3 时间戳类型

时间戳类型用于存储日期和时间值,PostgreSQL提供了timestamp和timestamp with time zone类型。

— 创建包含时间戳类型的表
CREATE TABLE fgedu_logs (
log_id SERIAL PRIMARY KEY,
fgedu_id INTEGER NOT NULL,
action VARCHAR(100) NOT NULL,
log_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);

— 插入数据
INSERT INTO fgedu_logs (fgedu_id, action) VALUES
(1, ‘登录系统’),
(2, ‘查看订单’),
(3, ‘修改密码’);

— 查询数据
SELECT * FROM fgedu_logs;
log_id | fgedu_id | action | log_time
——–+———+——–+——————————-
1 | 1 | 登录系统 | 2026-04-02 16:45:00.123456+08
2 | 2 | 查看订单 | 2026-04-02 16:45:00.123456+08
3 | 3 | 修改密码 | 2026-04-02 16:45:00.123456+08
(3 rows)

— 查询最近5分钟的日志
SELECT * FROM fgedu_logs WHERE log_time >= NOW() – INTERVAL ‘5 minutes’;
log_id | fgedu_id | action | log_time
——–+———+——–+——————————-
1 | 1 | 登录系统 | 2026-04-02 16:45:00.123456+08
2 | 2 | 查看订单 | 2026-04-02 16:45:00.123456+08
3 | 3 | 修改密码 | 2026-04-02 16:45:00.123456+08
(3 rows)

4.4 间隔类型

间隔类型用于存储时间间隔,PostgreSQL提供了interval类型。

— 创建包含间隔类型的表
CREATE TABLE fgedu_subscriptions (
subscription_id SERIAL PRIMARY KEY,
fgedu_id INTEGER NOT NULL,
subscription_type VARCHAR(50) NOT NULL,
duration INTERVAL NOT NULL,
start_date TIMESTAMP NOT NULL DEFAULT NOW()
);

— 插入数据
INSERT INTO fgedu_subscriptions (fgedu_id, subscription_type, duration) VALUES
(1, ‘月度会员’, INTERVAL ‘1 month’),
(2, ‘季度会员’, INTERVAL ‘3 months’),
(3, ‘年度会员’, INTERVAL ‘1 year’);

— 查询数据
SELECT * FROM fgedu_subscriptions;
subscription_id | fgedu_id | subscription_type | duration | start_date
—————-+———+——————-+———-+——————————-
1 | 1 | 月度会员 | 1 mon | 2026-04-02 16:50:00.123456+08
2 | 2 | 季度会员 | 3 mons | 2026-04-02 16:50:00.123456+08
3 | 3 | 年度会员 | 1 yr | 2026-04-02 16:50:00.123456+08
(3 rows)

— 查询订阅到期日期
SELECT
subscription_id,
fgedu_id,
subscription_type,
start_date,
start_date + duration AS end_date
FROM fgedu_subscriptions;
subscription_id | fgedu_id | subscription_type | start_date | end_date
—————-+———+——————-+——————————-+———————————
1 | 1 | 月度会员 | 2026-04-02 16:50:00.123456+08 | 2026-05-02 16:50:00.123456+08
2 | 2 | 季度会员 | 2026-04-02 16:50:00.123456+08 | 2026-07-02 16:50:00.123456+08
3 | 3 | 年度会员 | 2026-04-02 16:50:00.123456+08 | 2027-04-02 16:50:00.123456+08
(3 rows)

Part05-生产案例与实战讲解

下面是一个综合实战案例,展示如何在实际项目中使用PostgreSQL的基础数据类型。

— 创建一个完整的用户信息表
CREATE TABLE fgedu_fgedu_info (
— 主键ID
fgedu_id SERIAL PRIMARY KEY,
— 用户基本信息
fgeduname VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone VARCHAR(20),
— 个人信息
full_name VARCHAR(100),
gender CHAR(1) CHECK (gender IN (‘M’, ‘F’, ‘O’)),
age SMALLINT CHECK (age >= 0 AND age <= 150), -- 地址信息 address TEXT, zip_code VARCHAR(20), -- 账户信息 balance NUMERIC(12, 2) DEFAULT 0.00, points INTEGER DEFAULT 0, -- 时间信息 registration_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), last_login_date TIMESTAMP WITH TIME ZONE, -- 状态信息 is_active BOOLEAN DEFAULT TRUE, is_verified BOOLEAN DEFAULT FALSE, account_type VARCHAR(20) DEFAULT 'regular' ); -- 插入测试数据 INSERT INTO fgedu_fgedu_info ( fgeduname, password, email, phone, full_name, gender, age, address, zip_code, balance, points, last_login_date ) VALUES ( 'zhangsan', 'password123', 'zhangsan@fgedu.net.cn', '13800138001', '风哥1号', 'M', 25, '北京市朝阳区', '100000', 1000.50, 100, NOW() - INTERVAL '1 day' ), ( 'lisi', 'password456', 'lisi@fgedu.net.cn', '13800138002', '风哥2号', 'F', 30, '上海市浦东新区', '200000', 2500.75, 200, NOW() - INTERVAL '2 hours' ), ( 'wangwu', 'password789', 'wangwu@fgedu.net.cn', '13800138003', '王五', 'M', 28, '广州市天河区', '510000', 500.25, 50, NOW() - INTERVAL '1 week' ); -- 查询用户信息 SELECT fgedu_id, fgeduname, full_name, email, phone, age, balance, points, registration_date, last_login_date, is_active, is_verified FROM fgedu_fgedu_info; fgedu_id | fgeduname | full_name | email | phone | age | balance | points | registration_date | last_login_date | is_active | is_verified ---------+----------+-----------+------------------------+-------------+-----+----------+--------+---------------------------------+-------------------------------+-----------+-------------- 1 | zhangsan | 风哥1号 | zhangsan@fgedu.net.cn | 13800138001 | 25 | 1000.50 | 100 | 2026-04-02 17:00:00.123456+08 | 2026-04-01 17:00:00.123456+08 | t | f 2 | lisi | 风哥2号 | lisi@fgedu.net.cn | 13800138002 | 30 | 2500.75 | 200 | 2026-04-02 17:00:00.123456+08 | 2026-04-02 15:00:00.123456+08 | t | f 3 | wangwu | 王五 | wangwu@fgedu.net.cn | 13800138003 | 28 | 500.25 | 50 | 2026-04-02 17:00:00.123456+08 | 2026-03-26 17:00:00.123456+08 | t | f (3 rows) -- 查询最近登录的用户 SELECT fgeduname, full_name, last_login_date FROM fgedu_fgedu_info WHERE last_login_date >= NOW() – INTERVAL ‘3 days’
ORDER BY last_login_date DESC;
fgeduname | full_name | last_login_date
———-+———–+——————————-
lisi | 风哥2号 | 2026-04-02 15:00:00.123456+08
zhangsan | 风哥1号 | 2026-04-01 17:00:00.123456+08
(2 rows)

— 更新用户余额
UPDATE fgedu_fgedu_info SET balance = balance + 100.00 WHERE fgedu_id = 1;

— 查询更新后的用户余额
SELECT fgeduname, full_name, balance FROM fgedu_fgedu_info WHERE fgedu_id = 1;
fgeduname | full_name | balance
———-+———–+———-
zhangsan | 风哥1号 | 1100.50
(1 row)

Part06-风哥经验总结与分享

1. 数值类型选择建议:

  • 对于整数,优先使用integer类型,只有在数值范围超出integer范围时才使用bigint
  • 对于小数,如果需要精确计算(如财务数据),使用numeric类型;否则可以使用double precision
  • 避免使用real类型,因为它的精度较低,容易导致计算误差
  • 使用serial类型自动生成唯一ID,简化应用程序逻辑

2. 字符类型选择建议:

  • 对于固定长度的字符串(如身份证号、电话号码),使用char(n)类型
  • 对于可变长度的字符串(如用户名、产品名称),使用varchar(n)类型
  • 对于长文本(如文章内容、产品描述),使用text类型
  • 避免使用varchar(max)或类似的无限长度声明,应根据实际需求设置合理的最大长度

3. 日期/时间类型选择建议:

  • 对于只需要日期的场景,使用date类型
  • 对于只需要时间的场景,使用time类型
  • 对于需要同时存储日期和时间的场景,使用timestamp类型
  • 如果需要处理跨时区的数据,使用timestamp with time zone类型
  • 使用interval类型存储时间间隔,便于日期计算
风哥提示:选择数据类型时,应遵循最小化原则,即选择能满足需求的最小数据类型,这样可以减少存储空间,提高查询性能。同时,要考虑数据的完整性约束,如使用CHECK约束限制数值范围,使用UNIQUE约束确保数据唯一性。

4. 性能优化建议:

  • 对频繁查询的字段创建索引
  • 避免在WHERE子句中对列进行函数操作,否则会导致索引失效
  • 使用合适的数据类型可以提高索引效率
  • 对于大文本字段,可以考虑使用外部存储或分区表

5. 数据完整性建议:

  • 使用NOT NULL约束确保必填字段有值
  • 使用CHECK约束限制字段的取值范围
  • 使用UNIQUE约束确保字段值的唯一性
  • 使用DEFAULT约束为字段设置默认值

更多视频教程www.fgedu.net.cn

更多学习教程公众号风哥教程itpux_com

from PostgreSQL:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息