本章将详细介绍PostgreSQL支持的各种数据类型和运算符,帮助您正确选择和使用数据类型,以及掌握各种运算符的使用方法。
4.1 数值类型
整数类型
类型 |
大小 |
范围 |
说明 |
SMALLINT |
2字节 |
-32768 到 32767 |
小范围整数 |
INTEGER |
4字节 |
-2147483648 到 2147483647 |
常用整数类型 |
BIGINT |
8字节 |
-9223372036854775808 到 9223372036854775807 |
大范围整数 |
SERIAL |
4字节 |
1 到 2147483647 |
自增整数 |
BIGSERIAL |
8字节 |
1 到 9223372036854775807 |
大范围自增整数 |
精确数值类型
类型 |
说明 |
示例 |
DECIMAL(p,s) |
精确小数,p为总位数,s为小数位数 |
DECIMAL(10,2) |
NUMERIC(p,s) |
与DECIMAL相同 |
NUMERIC(8,3) |
浮点数类型
类型 |
大小 |
说明 |
示例 |
REAL |
4字节 |
单精度浮点数 |
3.14 |
DOUBLE PRECISION |
8字节 |
双精度浮点数 |
3.14159265358979 |
数值类型使用示例
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
price DECIMAL(10,2), -- 价格,保留2位小数
quantity INTEGER, -- 数量
weight REAL, -- 重量
rating NUMERIC(3,2) -- 评分,如4.95
);
4.2 字符串类型
字符类型
类型 |
说明 |
示例 |
CHAR(n) |
固定长度字符,不足时用空格填充 |
CHAR(10) |
VARCHAR(n) |
可变长度字符,最大长度n |
VARCHAR(255) |
TEXT |
可变长度文本,无长度限制 |
TEXT |
字符串类型使用示例
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username CHAR(20), -- 用户名,固定20字符
email VARCHAR(255), -- 邮箱,最大255字符
bio TEXT -- 个人简介,无长度限制
);
4.3 日期/时间类型
日期时间类型
类型 |
大小 |
说明 |
示例 |
DATE |
4字节 |
日期(无时间) |
'2023-10-15' |
TIME |
8字节 |
时间(无日期) |
'14:30:00' |
TIMESTAMP |
8字节 |
日期和时间 |
'2023-10-15 14:30:00' |
TIMESTAMPTZ |
8字节 |
带时区的时间戳 |
'2023-10-15 14:30:00+08' |
INTERVAL |
16字节 |
时间间隔 |
'1 day 2 hours' |
日期时间使用示例
CREATE TABLE events (
id SERIAL PRIMARY KEY,
event_name VARCHAR(255),
start_date DATE, -- 开始日期
start_time TIME, -- 开始时间
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, -- 更新时间(带时区)
duration INTERVAL -- 持续时间
);
4.4 布尔类型
布尔类型
类型 |
大小 |
说明 |
允许值 |
BOOLEAN |
1字节 |
布尔值 |
TRUE, FALSE, NULL |
布尔类型使用示例
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50),
is_active BOOLEAN DEFAULT TRUE, -- 是否激活
is_admin BOOLEAN DEFAULT FALSE -- 是否管理员
);
4.5 JSON类型
JSON数据类型
类型 |
说明 |
特点 |
JSON |
文本形式存储JSON数据 |
保持原始输入格式 |
JSONB |
二进制形式存储JSON数据 |
更快的处理速度,支持索引 |
JSON类型使用示例
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
attributes JSON, -- JSON格式属性
metadata JSONB -- JSONB格式元数据
);
-- 插入JSON数据
INSERT INTO products (name, attributes, metadata) VALUES
('智能手机',
'{"color": "black", "storage": "128GB", "camera": "48MP"}',
'{"category": "electronics", "brand": "XYZ", "warranty": "2 years"}'
);
4.6 数组类型
数组类型
PostgreSQL支持所有数据类型的数组:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
scores INTEGER[], -- 整数数组
tags TEXT[], -- 文本数组
schedule TIMESTAMPTZ[][] -- 二维时间戳数组
);
-- 插入数组数据
INSERT INTO students (name, scores, tags) VALUES
('张三', ARRAY[85, 92, 78, 96], ARRAY['优秀', '努力']),
('李四', ARRAY[90, 88, 95], ARRAY['勤奋', '聪明']);
4.7 网络地址类型
网络地址类型
类型 |
说明 |
示例 |
INET |
IPv4或IPv6主机地址 |
'192.168.1.1', '2001:4f8:3:ba::/64' |
CIDR |
IPv4或IPv6网络地址 |
'192.168.1.0/24', '2001:4f8:3:ba::/64' |
MACADDR |
MAC地址 |
'08:00:2b:01:02:03' |
网络地址类型使用示例
CREATE TABLE network_devices (
id SERIAL PRIMARY KEY,
device_name VARCHAR(100),
ip_address INET, -- IP地址
network CIDR, -- 网络地址
mac_address MACADDR -- MAC地址
);
4.8 算术运算符
基本算术运算符
运算符 |
说明 |
示例 |
结果 |
+ |
加法 |
5 + 3 |
8 |
- |
减法 |
5 - 3 |
2 |
* |
乘法 |
5 * 3 |
15 |
/ |
除法 |
5 / 2 |
2.5 |
% |
取模 |
5 % 2 |
1 |
^ |
幂运算 |
2 ^ 3 |
8 |
|/ |
平方根 |
|/ 25 |
5 |
算术运算示例
SELECT
10 + 5 AS addition,
10 - 5 AS subtraction,
10 * 5 AS multiplication,
10 / 3 AS division,
10 % 3 AS modulo,
2 ^ 3 AS power,
|/ 16 AS square_root;
4.9 比较运算符
比较运算符
运算符 |
说明 |
示例 |
结果 |
< |
小于 |
5 < 10 |
TRUE |
> |
大于 |
5 > 10 |
FALSE |
<= |
小于等于 |
5 <= 5 |
TRUE |
>= |
大于等于 |
5 >= 10 |
FALSE |
= |
等于 |
5 = 5 |
TRUE |
<> 或 != |
不等于 |
5 <> 10 |
TRUE |
比较运算示例
SELECT
name,
price
FROM products
WHERE price > 100 AND price <= 1000;
4.10 逻辑运算符
逻辑运算符
运算符 |
说明 |
示例 |
AND |
逻辑与 |
price > 100 AND category = 'electronics' |
OR |
逻辑或 |
category = 'electronics' OR category = 'books' |
NOT |
逻辑非 |
NOT is_active |
逻辑运算示例
SELECT * FROM products
WHERE (category = 'electronics' OR category = 'books')
AND price BETWEEN 50 AND 500
AND NOT discontinued;
4.11 字符串运算符
字符串运算符
运算符 |
说明 |
示例 |
结果 |
|| |
字符串连接 |
'Hello' || ' ' || 'World' |
'Hello World' |
LIKE |
模式匹配 |
name LIKE 'A%' |
匹配以A开头的名称 |
ILIKE |
不区分大小写模式匹配 |
name ILIKE 'a%' |
匹配以a或A开头的名称 |
字符串运算示例
SELECT
first_name || ' ' || last_name AS full_name,
email
FROM users
WHERE email LIKE '%@gmail.com'
OR first_name ILIKE 'john%';
4.12 数组运算符
数组运算符
运算符 |
说明 |
示例 |
= |
数组相等 |
ARRAY[1,2,3] = ARRAY[1,2,3] |
@> |
包含 |
ARRAY[1,2,3] @> ARRAY[1,2] |
<@ |
被包含 |
ARRAY[1,2] <@ ARRAY[1,2,3] |
&& |
重叠 |
ARRAY[1,2] && ARRAY[2,3] |
数组运算示例
SELECT * FROM students
WHERE tags @> ARRAY['优秀']
OR scores && ARRAY[95, 96, 97, 98, 99, 100];
4.13 JSON运算符
JSON运算符
运算符 |
说明 |
示例 |
-> |
获取JSON对象字段 |
metadata->'category' |
->> |
获取JSON对象字段为文本 |
metadata->>'category' |
@> |
包含 |
metadata @> '{"brand": "XYZ"}' |
? |
是否存在键 |
metadata ? 'brand' |
JSON运算示例
SELECT
name,
attributes->>'color' AS color,
metadata->>'brand' AS brand
FROM products
WHERE metadata @> '{"category": "electronics"}'
AND attributes ? 'camera';
提示:选择合适的数据类型对于数据库性能和存储效率非常重要。在设计表结构时,应根据实际需求选择最合适的数据类型。