postgresql 基本类型

1.1 整数类型

integer		4字节
smallint	2字节
bigint		8字节

1.2 任意精度类型

NUMERIC(precision, scale)

1.3 浮点数类型

float4		单精度,4字节
float8		双精度,8字节

1.4 金额类型

/* 显示和客户端参数lc monetary有关 */
money	存储空间 8字节,默认有2位小数

/* 显示和客户端参数lc monetary有关 */
> show  lc_monetary;
zh_CN.UTF-8
/* 设置为美元 */
> set lc_monetary='en_US.UTF-8';

/*  numeric、int、bigint型数据类型转换为money  */
> SELECT '12.34'::numeric::money;
¥12.34
> SELECT '12.34'::money::numeric;
12.34

1.5 序列类型

/* 序列类型通常用于自增ID */
smallserial		2字节
serial			4字节
bigserial		8字节

1.6 字符类型

varchar(n)		有长度限制的字符串
char(n)			定长字符串,长度不足则向后填充空白字符
text			不限长度

1.7 枚举类型

枚举类型中指定的值大小写敏感,匹配时值必须完全一致,
CREATE TYPE mood AS ENUM ('sad', ok', 'happy');

输入一个不存在的枚举值将报错 
SELECT * FROM person WHERE current_hood = 'happ':
避免报错的方法把举转换成text 
SELECT * FROM person WHERE current_hood::text = 'happ':
查询枚举的大小,枚举的标签在定义中最大限制由NAMEDATALEN决定,默认是64-1。
select oid,typname from pg_type where typname='mood';
select * from pg_enum where enumtypid=3952969;
select enum_first('sad'::mood);   // 返回此枚举类型的第一个值
select enum_last('sad'::mood);    // 返回此枚举类型的最后一个值
select enum_range('sad'::mood);   // 返回枚举类型的所有值
select enum_range('sad'::mood , 'happy'::mood); // 返回两个枚举类型之间的范围

1.8 网络地址类型

cidr		IPv4 或 IPv6 网络
inet		IPv4 或 IPv6 主机和网络
macaddr		6 字节 MAC 地址

1.9 几何类型

point 二维平面上的点,用(x, y)表示,x、y分别表示x轴、y轴的坐标值
create table test_point (name text, pt point);
INSERT INTO test_point (name, pt) VALUES ('p1', '(1.1, 22.0)');

/* ?- :是否横向齐平(y坐标是否相同) */
SELECT * FROM test_point WHERE pt ?- '(0,22)';
/* ?| :是否纵向齐平(x坐标是否相同) */
SELECT * FROM test_point WHERE pt ?| '(1.1,0)';
circle,圆,用圆心和半径表示,如 (x, y, r)其中(x,y)为圆心,r为半径。
CREATE table test_circle (name text, cc circle);
INSERT INTO test_circle (name, cc) VALUES ('c1', '1, 2, 2');

/* <@ 	点是否位于圆内 */
/* @> 	圆是否包含点 */
SELECT * FROM test_circle WHERE cc @> point '(1,2)';

/* << 	圆是否严格在圆的左侧 */
/* >> 	圆是否严格在圆的右侧 */
 SELECT * FROM test_circle WHERE cc << circle '10,6,3';

/* <-> 	两个圆之间的距离 */
SELECT circle '((0,0),1)' <-> circle '((5,0),1)';
line,线,在坐标系上用Ax + By + C = 0表示,也就是一个二元一次方程,A、B表示斜率,C表示偏移量。
CREATE TABLE test_line (name text, info line);
INSERT INTO test_line VALUES ('c1', '(0, 1), (2, 3)');

?|| 	两条线是否平行
SELECT * FROM test_line WHERE info ?|| '{1,-1,10}';
?-| 	两条线是否垂直
SELECT * FROM test_line WHERE info ?-| '{1,1,10}';
lseg 线段
CREATE TABLE test_lseg (name text, info lseg);
INSERT INTO test_lseg VALUES ('c1', '((0, 1), (2, 3))');
INSERT INTO test_lseg VALUES ('c2', '[(0, 1), (2, 3)]');
box 四变形的对角点对表示
CREATE TABLE test_box (name text, info box);
INSERT INTO test_box VALUES ('c1', '((1, 1), (2, 3))');
path 线路
CREATE TABLE test_path (name text, info path);
INSERT INTO test_path VALUES ('c1', '((0, 1), (2, 3), (4,5), (3, 6))');
INSERT INTO test_path VALUES ('c2', '[(0, 1), (2, 3), (4,5), (3, 6)]');
INSERT INTO test_path VALUES ('c3', '(0, 1, 2, 3, 4, 5, 3, 6)');

2.0 文本搜索类型

to_tsvector:规范化文本中出现的词
> SELECT to_tsvector('a fat cat sat on a mat and ate a fat rat');
'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4

https://zhuanlan.zhihu.com/p/105097036

posted @ 2023-12-15 00:08  osbreak  阅读(130)  评论(0编辑  收藏  举报