-- 创建表(cidr类型存储IP)CREATETABLE test (
id BIGSERIAL,
ip_address CIDR
);-- 插入数据INSERTINTO test (ip_address)VALUES('192.168.1.1/24');-- 范围查询(查找192.168.1.0/24网段)SELECT*FROM test WHERE ip_address <<'192.168.1.0/24';
优势对比
特性
PostgreSQL (cidr)
MySQL (字符串)
格式校验
✅
❌
子网范围查询
✅
❌
存储优化
✅
❌
11-25 & 12-26. JSON类型操作
JSON vs JSONB
特性
JSON
JSONB
索引支持
❌
✅
保留空格/格式
✅
❌(自动去除)
键顺序保留
✅
❌
重复键处理
保留最后一个值
保留最后一个值
存储方式
文本存储
二进制序列化
操作示例
-- 创建表(含JSON和JSONB字段)CREATETABLE test (
id BIGSERIAL,data JSON,
data_b JSONB
);-- 插入数据INSERTINTO test (data, data_b)VALUES('{"name": "张三", "age": 23, "birthday": "1999-01-01"}','{"name": "李四", "age": 25, "birthday": "2000-01-01"}');-- 查询JSON字段中的值SELECTdata->>'name'AS name FROM test;
CREATEINDEX idx_data_b ON test USING GIN (data_b);
13-27. 复合类型操作
概念
类似Java对象嵌套:将复杂结构映射为数据库类型,避免多表关联。
示例:用户表包含info字段,存储姓名和年龄。
操作示例
-- 创建复合类型CREATETYPE user_info AS(
name VARCHAR(50),
age INT);-- 创建表使用复合类型CREATETABLE tb_user (
id BIGSERIAL,
info user_info
);-- 插入数据INSERTINTO tb_user (info)VALUES(('张三',23));
14-28 & 15-29. 数组类型操作
声明与使用
-- 创建表(支持一维/多维数组)CREATETABLE test (
id BIGSERIAL,
numbers INT[],
matrix INT[][]);-- 插入数据INSERTINTO test (numbers, matrix)VALUES('{1,2,3}','{{4,5}, {6,7}}');-- 查询数组元素SELECT numbers[1]AS first_element FROM test;-- 索引从1开始