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