️ PostgreSQL 数据类型

news/2025/10/18 21:35:06/文章来源:https://www.cnblogs.com/kyle-7Qc/p/19150183

一、数据类型体系概览

PostgreSQL 拥有极其丰富的数据类型系统,既包含标准 SQL 类型,也扩展了许多高级类型。

1.1 数据类型分类总览

分类 主要类型 特点 应用场景
数值类型 整数、小数、浮点数 精确/近似计算 统计、财务、科学计算
字符串类型 CHAR, VARCHAR, TEXT 文本存储与处理 用户信息、文章内容
布尔类型 BOOLEAN 逻辑判断 状态标志、开关设置
日期时间 DATE, TIME, TIMESTAMP 时间处理 日志、事件、计划
二进制数据 BYTEA 原始字节存储 文件、图像、加密数据
枚举类型 ENUM 预定义值集合 状态码、分类标签
几何类型 POINT, LINE, CIRCLE 空间数据 地理位置、图形计算
网络类型 INET, CIDR, MACADDR 网络地址 设备管理、日志分析
JSON 类型 JSON, JSONB 半结构化数据 配置、API 数据
数组类型 type[] 同类型集合 标签、多值属性
范围类型 数值/日期范围 连续区间 时间段、价格区间
特殊类型 UUID, XML, TSVECTOR 特定用途 唯一标识、全文搜索

二、数值类型详解

2.1 整数类型对比

类型 别名 存储空间 范围 描述 推荐场景
smallint int2 2 字节 -32,768 到 32,767 小范围整数 年龄、数量较小计数
integer int4 4 字节 -2.1亿 到 2.1亿 标准整数 ID、计数、大多数数值
bigint int8 8 字节 ±9.2×10¹⁸ 大范围整数 大数据量、金融金额

2.2 自增序列类型

类型 基础类型 存储空间 范围 描述
smallserial smallint 2 字节 1 到 32,767 自增小整数
serial integer 4 字节 1 到 2.1亿 自增整数(推荐)
bigserial bigint 8 字节 1 到 9.2×10¹⁸ 自增大整数

示例:

CREATE TABLE users (id SERIAL PRIMARY KEY,        -- 自增主键age SMALLINT,                 -- 年龄login_count INTEGER,          -- 登录次数big_number BIGINT             -- 大数值
);

2.3 精确小数类型

类型 别名 存储空间 精度控制 描述 适用场景
decimal(p,s) numeric(p,s) 可变 精确 定点小数 财务计算、精确测量
numeric(p,s) decimal(p,s) 可变 精确 定点小数 同 decimal

精度参数说明:

  • p:总位数(1-1000+)
  • s:小数位数
CREATE TABLE financial_data (price DECIMAL(10,2),      -- 价格:总共10位,2位小数tax_rate NUMERIC(5,4),    -- 税率:0.0000 到 0.9999amount NUMERIC            -- 任意精度
);

2.4 浮点数类型

类型 别名 存储空间 精度 范围 特点
real float4 4 字节 6位 ±1.18×10⁻³⁸ 到 ±3.4×10³⁸ 单精度,性能好
double precision float8 8 字节 15位 ±2.23×10⁻³⁰⁸ 到 ±1.79×10³⁰⁸ 双精度,更精确

示例:

CREATE TABLE scientific_data (temperature REAL,                    -- 温度测量precise_calculation DOUBLE PRECISION -- 精确计算
);

三、字符串与文本类型

3.1 字符串类型对比

类型 描述 存储空间 特点 推荐场景
char(n) 定长字符串 n 字节 不足补空格,检索快 固定长度代码(如国家代码)
varchar(n) 变长字符串 实际长度+1 长度限制,节省空间 有限长度文本(用户名、邮箱)
text 变长文本 实际长度+1 无长度限制,功能强 任意长度文本(内容、描述)

3.2 字符串类型选择指南

场景 推荐类型 理由
固定长度编码 CHAR(n) 存储效率高,性能好
有限可变文本 VARCHAR(n) 空间优化,有约束
任意长度内容 TEXT 无限制,最灵活
不确定长度 TEXT 避免长度限制问题

示例:

CREATE TABLE user_data (country_code CHAR(2),        -- 国家代码,固定2位username VARCHAR(50),        -- 用户名,最多50字符email VARCHAR(100),          -- 邮箱地址biography TEXT,              -- 个人简介,无长度限制phone CHAR(11)               -- 电话号码
);

四、日期时间类型

4.1 日期时间类型详解

类型 完整名称 存储空间 范围 精度 示例
date DATE 4 字节 4713 BC - 5874897 AD 1 天 '2024-01-15'
time TIME 8 字节 00:00:00 - 24:00:00 1 微秒 '14:30:25.123456'
timestamp TIMESTAMP 8 字节 4713 BC - 5874897 AD 1 微秒 '2024-01-15 14:30:25'
timestamptz TIMESTAMP WITH TIME ZONE 8 字节 4713 BC - 5874897 AD 1 微秒 '2024-01-15 14:30:25+08'
interval INTERVAL 16 字节 ±178000000 年 1 微秒 '2 days 3 hours'

4.2 日期时间操作示例

-- 创建表
CREATE TABLE events (event_date DATE,                          -- 事件日期start_time TIME,                          -- 开始时间created_at TIMESTAMP,                     -- 创建时间(无时区)updated_at TIMESTAMPTZ DEFAULT NOW(),     -- 更新时间(带时区)duration INTERVAL                         -- 持续时间
);-- 常用函数
SELECT NOW() AS current_time,                    -- 当前时间戳CURRENT_DATE AS today,                    -- 当前日期CURRENT_TIME AS now_time,                 -- 当前时间EXTRACT(YEAR FROM created_at) AS year,    -- 提取年份AGE(created_at) AS time_ago;              -- 计算时间间隔

五、布尔与二进制类型

5.1 布尔类型

类型 存储空间 取值 有效输入
boolean 1 字节 TRUE, FALSE, NULL true/false, 't'/'f', 'yes'/'no', '1'/'0'

示例:

CREATE TABLE settings (is_active BOOLEAN DEFAULT TRUE,is_verified BOOLEAN DEFAULT FALSE,newsletter_optin BOOLEAN
);-- 多种写入方式
INSERT INTO settings VALUES (TRUE, FALSE, NULL),('t', 'f', 'yes'),('1', '0', 'no');

5.2 二进制类型

类型 描述 存储空间 格式 应用场景
bytea 二进制数据 1-4字节+实际大小 十六进制或转义格式 文件存储、图片、加密数据

示例:

CREATE TABLE documents (id SERIAL PRIMARY KEY,file_name TEXT,file_data BYTEA,              -- 存储二进制文件file_size INTEGER
);-- 插入二进制数据
INSERT INTO documents (file_name, file_data) 
VALUES ('image.png', E'\\x89504E470D0A1A0A0000000D49484452');

六、高级数据类型

6.1 JSON 类型对比

类型 存储格式 验证 索引支持 性能 推荐度
JSON 文本格式 写入时验证 有限 读取慢,写入快 ★★☆☆☆
JSONB 二进制格式 写入时验证 完整 读取快,写入稍慢 ★★★★★

JSONB 示例:

CREATE TABLE user_profiles (id SERIAL PRIMARY KEY,profile_data JSONB,           -- 推荐使用 JSONBcreated_at TIMESTAMPTZ DEFAULT NOW()
);-- 插入 JSON 数据
INSERT INTO user_profiles (profile_data) VALUES 
('{"name": "张三","age": 30,"address": {"city": "北京","street": "朝阳区"},"hobbies": ["读书", "游泳", "编程"]
}');-- JSON 查询操作
SELECT profile_data->>'name' AS name,                    -- 获取字符串值profile_data->'address'->>'city' AS city,         -- 嵌套查询profile_data->'hobbies'->>0 AS primary_hobby      -- 数组元素
FROM user_profiles;-- JSON 路径查询
SELECT profile_data#>>'{address,city}' AS city FROM user_profiles;

6.2 数组类型

声明方式 示例 描述
数据类型[] INTEGER[] 整数数组
数据类型[长度] VARCHAR(50)[] 字符串数组
多维数组 TEXT[][] 文本二维数组

数组操作示例:

CREATE TABLE products (id SERIAL PRIMARY KEY,name TEXT,tags TEXT[],                    -- 标签数组prices DECIMAL[],               -- 价格历史dimensions INTEGER[3]           -- 固定长度数组
);-- 插入数组数据
INSERT INTO products (name, tags, prices, dimensions) VALUES 
('笔记本电脑', '{"电子产品","电脑","便携"}', '{4999.00, 4599.00, 4799.00}', '{30,20,5}');-- 数组查询
SELECT name,tags[1] AS primary_tag,         -- 访问数组元素array_length(tags, 1) AS tag_count,  -- 数组长度unnest(tags) AS individual_tag  -- 展开数组
FROM products
WHERE '电子产品' = ANY(tags);        -- 数组包含检查

6.3 范围类型

类型 描述 示例 适用场景
int4range 整数范围 [1,10) 年龄范围、数量区间
int8range 大整数范围 [100,1000] ID 范围、大数值区间
numrange 数值范围 (10.5,20.5] 价格区间、测量范围
tsrange 时间戳范围 [2024-01-01,2024-12-31] 时间段、有效期
daterange 日期范围 [2024-01-01,2024-06-30] 日期区间

范围类型示例:

CREATE TABLE reservations (id SERIAL PRIMARY KEY,room_id INTEGER,period TSRANGE,                 -- 时间段price_range NUMRANGE           -- 价格范围
);INSERT INTO reservations (room_id, period, price_range) VALUES 
(1, '[2024-01-15 14:00, 2024-01-20 10:00)', '[100.00, 200.00)');-- 范围查询
SELECT * FROM reservations 
WHERE period @> '2024-01-16 12:00'::TIMESTAMP;  -- 包含时间点

七、特殊数据类型

7.1 网络地址类型

类型 描述 存储空间 示例 适用场景
inet IP地址(IPv4/IPv6) 7或19字节 '192.168.1.1' 设备IP管理
cidr 网络地址块 7或19字节 '192.168.1.0/24' 子网划分
macaddr MAC地址 6字节 '08:00:2b:01:02:03' 网络设备

示例:

CREATE TABLE network_devices (id SERIAL PRIMARY KEY,device_name TEXT,ip_address INET,network CIDR,mac_address MACADDR
);-- 网络操作
SELECT ip_address,HOST(ip_address) AS host,           -- 提取主机部分MASKLEN(network) AS mask_length     -- 子网掩码长度
FROM network_devices
WHERE ip_address << network;            -- IP是否在网段内

7.2 其他特殊类型

类型 描述 存储空间 示例 用途
uuid 通用唯一标识符 16字节 '550e8400-e29b-41d4-a716-446655440000' 分布式ID
xml XML数据 可变 <book><title>SQL</title></book> 结构化文档
money 货币金额 8字节 '$123.45' 金融数据
tsvector 全文搜索向量 可变 'cat:1 dog:2' 全文索引
tsquery 全文搜索查询 可变 'cat & dog' 搜索查询

UUID 示例:

-- 启用 UUID 扩展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";CREATE TABLE distributed_users (user_id UUID DEFAULT uuid_generate_v4(),  -- 自动生成 UUIDusername TEXT,created_at TIMESTAMPTZ DEFAULT NOW()
);INSERT INTO distributed_users (username) VALUES ('john_doe');

八、枚举与几何类型

8.1 枚举类型

-- 创建枚举类型
CREATE TYPE user_status AS ENUM ('active', 'inactive', 'suspended');
CREATE TYPE product_size AS ENUM ('small', 'medium', 'large', 'x-large');-- 使用枚举
CREATE TABLE users (id SERIAL PRIMARY KEY,name TEXT,status user_status DEFAULT 'active'
);CREATE TABLE products (id SERIAL PRIMARY KEY,name TEXT,size product_size
);

8.2 几何类型

类型 描述 存储空间 示例 用途
point 点坐标 16字节 (3,5) 地理位置
line 无限直线 32字节 {1,-1,0} 几何计算
lseg 线段 32字节 [(1,2),(3,4)] 线段表示
box 矩形 32字节 (1,1),(0,0) 边界框
path 路径 16+16n字节 [(0,0),(1,1),(2,0)] 运动轨迹
polygon 多边形 40+16n字节 ((0,0),(1,0),(1,1),(0,1)) 区域划分
circle 圆形 24字节 <(1,1),2> 圆形区域

九、类型选择最佳实践

9.1 数据类型选择指南

数据特征 推荐类型 理由 示例
主键标识 SERIAL, BIGSERIAL, UUID 自动生成,保证唯一性 用户ID、订单ID
金额价格 NUMERIC/DECIMAL 精确计算,避免误差 商品价格、账户余额
一般文本 TEXT 无长度限制,灵活 文章内容、描述
固定代码 CHAR(n) 存储效率高 国家代码、状态码
时间戳 TIMESTAMPTZ 时区支持,标准化 创建时间、更新时间
开关状态 BOOLEAN 语义清晰,存储高效 是否激活、是否验证
配置数据 JSONB 灵活结构,查询高效 用户配置、元数据
多个值 数组类型 避免关联表 标签、分类
唯一标识 UUID 分布式唯一性 分布式系统ID
二进制文件 BYTEA 原生二进制支持 图片、文档

9.2 性能优化建议

场景 优化建议 理由
频繁查询的数值 使用合适范围的整数类型 减少存储,提高计算速度
文本搜索 TEXT 列创建索引 加速文本查询
JSON 查询 使用 JSONB + GIN 索引 支持各种 JSON 查询
范围查询 使用范围类型 + GiST 索引 高效的范围操作
数组操作 对数组列创建 GIN 索引 加速数组包含查询

十、类型转换与函数

10.1 类型转换方法

-- 显式类型转换
SELECT '123'::INTEGER;
SELECT CAST('123' AS INTEGER);
SELECT '2024-01-15'::DATE;-- 隐式类型转换
SELECT 3 + '5';                    -- 自动转为数字
SELECT 'Hello' || 123;             -- 自动转为文本-- 类型检测
SELECT pg_typeof(123.4);           -- 返回数据类型

10.2 常用类型函数

类别 函数 描述 示例
数值函数 ROUND(), CEIL(), FLOOR() 四舍五入、向上/向下取整 ROUND(3.14159, 2) → 3.14
字符串函数 LENGTH(), UPPER(), LOWER() 长度、大小写转换 LENGTH('hello') → 5
日期函数 EXTRACT(), DATE_PART(), AGE() 提取部分、计算间隔 EXTRACT(YEAR FROM NOW())
JSON函数 ->, ->>, jsonb_extract_path() JSON 数据提取 data->>'name'
数组函数 array_length(), unnest() 数组操作 unnest(tags)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/939774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

总想要透过你眼睛 去找寻最原始的野性 没想到最后却闯进 一整座森林的宁静 你呼吸 蓝丝绒包裹身体 和海洋的哼鸣 我永远不愿醒 我可以 躲进你的身体 进入温暖的你 躲进你的身体 进入温暖的你 总想要透过你眼睛 去找寻水…

CSP-J/S 2025 第一轮游记

前言 感觉这次 CSP 打的还可以,达到超过分数线 \(10\) 分的目标了。希望复赛也能拿到可观的分数。 当然,You have no egg!。 考前三天 考前三天。一到机房就和 yanzixuan2024 它们打术士,真不错。 考前两天 下午 4:…

【汇编和指令集 . 第2025 .10期】万般皆为投影

【编者按】Unicode整理、编码了世界上大部分的文字系统,使得电脑可以用更为简单的方式来呈现和处理文字,目前已经收录超过13万个字符,涵盖了从基本的拉丁字母到复杂的汉字、日文和阿拉伯文字等。汇编和指令集是计算…

小作业 12

已知 \(x\sqrt{1-y^2}+y\sqrt{1-x^2}=1\),求证 \(x^2+y^2=1\)。\[x\sqrt{1-y^2}+y\sqrt{1-x^2}=1 \]\[x\sqrt{1-y^2}=1-y\sqrt{1-x^2} \]\[x^2(1-y^2)=1+y^2(1-x^2)-2y\sqrt{1-x^2} \]\[2y\sqrt{1-x^2}=1+y^2-x^2 \]\…

Python 潮流周刊#123:你可能不需要单例模式

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…

Python 潮流周刊#122:Python 3.14 来了,速度如何?

🎉 1024程序员节特惠: 10.24 - 10.31 期间,本周刊年费仅需 99 元(原价 148 元),一年一次的大幅优惠,敬请留意! 本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源…

机器学习在视频质量检测中的技术应用

本文详细介绍了某视频平台如何利用机器学习技术检测视频质量缺陷,包括块状损坏检测、音频伪影识别和音视频同步问题检测等技术方案,通过残差神经网络和预训练音频模型实现自动化质量监控。机器学习在视频质量检测中的…

实用指南:【读书笔记】《苏东坡》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一位焦虑的普通二本软件工程的学生

介绍 我是一位普通的大三本科生,学的东西有点杂c语言,java,js,ts,go,python...总想着什么都涉及一点,我很贪心。 回顾 高二 高二的寒假,闲着无聊的我用电脑刷着b站。那时候是高中我没有手机,偶然间我刷到了狂…

C++类的运算符重载

1、加号运算符重载(加减乘除) 首先假设你有一个Person类,里面有个成员变量m_a和m_b,现在你想使p1+p2等价于p1.m_a+p2.m_a,p1.m_b+p2.m_bclass Person { public:Person() {};Person(int a, int b) : m_a(a), m_b(b) …

10.18 CSP-S模拟34/2025多校CSP模拟赛6 改题记录

水HZOJ 写在前面 改了inf小时T3还没改出来破如防,本来不想写的,但还是随便写写吧。 A. 最长不下降子序列 哈哈哈过不去的大水题。 题意是给出一个由1和2组成的序列,可以选择某个连续区间翻转,求问最长不下降子序列…

微软Office LTSC 2021(KpoJIuK直装版)x64 v16.0.14334.20344 10月版

微软Office 2021 是微软公司最新发布的办公套件,提供了一系列强大的软件工具,包括Word、Excel、PowerPoint和Outlook等。 软件功能 Word:提供用于创建、编辑和格式化文档的功能,包括文字处理、图形插入、表格制作…

React Query入门指南:简化React应用中的信息获取

React Query入门指南:简化React应用中的信息获取2025-10-18 20:53 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

征程 6 | 征程 6 工具链如何支持 Matmul/Conv 双 int16 输入量化?

一、前言 在征程 6 工具链的量化精度调优实践中,当 Matmul/Conv 算子的两个输入皆为量化敏感算子时,PTQ 与 QAT 各自面临着难以克服的棘手困境。 在 PTQ 流程里,为了实现双 int16 输入的支持,工作人员不得不借助脚…

做题技巧与结论证明

优先考虑单调性。 优先考虑 dfn 区间。 优先考虑直径。 优先考虑写 gf。 这个可能是假的 优先考虑凸性。 优先考虑必要条件,再补一补断言这是充要条件。 优先考虑最大元。 结论: 谁跟你结论,斜杠糗大了

CSP-S模拟34/2025多校冲刺CSP模拟赛6

写在前面:废话 坏坏坏坏坏坏坏,假假假假假假假,唐唐唐唐唐唐唐,爆爆爆爆爆爆爆,蒻蒻蒻蒻蒻蒻蒻!!!!111P推歌 《幸福安心委员会》 どうして みんなが幸せなの? 为什么 大家都这么幸福呢? この世界のこと 闻…

Java学习通互评5

1.StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同? 前者用ArrayList,后者用普通数组;前者无需指定初始容量,后者需在创建对象时传入数组大小;前者支持动态扩容,后者容量固定,数组满后无法继续添加;…

卡车厂实习第三天

1、每个活可以一个一个干,也可以串联起来干,串联起来更省时省力,找技巧,还得知道为什么冷媒充700或者900或者1700,玻璃水为了降本加一瓶的量。 2、今天充冷媒的时候发现充不进去,可能是接头活塞在拧螺丝的时候碎…

随机数技术

随机数应用、生成方法、随机性检验随机数应用密钥 加密:不确定算法引入随机数实现 签名 认证:抗重放、假冒 密钥协商安全要求:随机性分布均匀性:0,1频率大致相等 独立性:任何子序列不能有其他子序列推导不可预测性…

我做 AI 算法 10 年,见过最可惜的事:技术再牛,说不明白也是白搭

我做 AI 算法 10 年,见过最可惜的事:技术再牛,说不明白也是白搭大家好,我是李老师。过去 5 年在互联网大厂做 AI 落地时,我见过不少 “技术大牛”—— 有人能把自然语言处理模型调得比行业均值精准 10%,有人能在…