数值类型
数值类型也叫数字类型。由1、2、4或8字节的整数以及4或8字节的浮点数和可选精度小数组成。
对应的数字操作符和相关函数,请参见数字操作函数和操作符。
GaussDB(DWS)支持的数值类型按精度可以分为:整数类型,任意精度型,浮点类型和序列整型。
整数类型
TINYINT、SMALLINT、INTEGER、BINARY_INTEGER和BIGINT类型存储整个数值(不带有小数部分),也就是整数。如果尝试存储超出范围以外的数值将会导致错误。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
TINYINT |
微整数,别名为INT1。 |
1字节 |
0 ~ 255 |
SMALLINT |
小范围整数,别名为INT2。 |
2字节 |
-32,768 ~ +32,767 |
INTEGER |
常用的整数,别名为INT4。 |
4字节 |
-2,147,483,648 ~ +2,147,483,647 |
BINARY_INTEGER |
常用的整数INTEGER的别名,为兼容Oracle类型。 |
4字节 |
-2,147,483,648 ~ +2,147,483,647 |
BIGINT |
大范围的整数,别名为INT8。 |
8字节 |
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
示例:
1 2 3 4 5 6 7 |
CREATE TABLE int_type_t1 ( a TINYINT, b TINYINT, c INTEGER, d BIGINT ); |
插入数据。
1
|
INSERT INTO int_type_t1 VALUES(100, 10, 1000, 10000); |
查看数据。
1 2 3 4 5 |
SELECT * FROM int_type_t1; a | b | c | d -----+----+------+------- 100 | 10 | 1000 | 10000 (1 row) |
任意精度型
NUMBER类型能够用于存储对于精度位数没有限制的数字,并且可以用于执行精确计算。当要求高精确度时,推荐使用这种类型来存储货币总量和其他类型的数量值。与整数类型相比,任意精度类型需要更大的存储空间,其存储效率、运算效率以及压缩比效果都要差一些。
NUMBER类型数值的范围是小数点右边部分的小数位数。NUMBER类型数值的精度是指整个数值包含的所有数字,也就是小数点左右两边的所有数字。所以,可以说数值23.1234的精度为6,范围是4。可以认为整数的范围是0。
使用Numeric/Decimal进行列定义时,建议指定该列的精度p(总位数)以及范围s(小数位数)。
如果数值的精度或者范围大于列的数据类型所声明的精度和范围,那么系统将会试图对这个值进行四舍五入。如果不能对数值进行四舍五入的处理来满足数据类型的限制,则会报错。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
NUMERIC[(p[,s])], DECIMAL[(p[,s])] |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
NUMBER[(p[,s])] |
NUMERIC类型的别名,为兼容Oracle数据类型。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
示例:
创建带有DECIMAL数值类型的表。
1
|
CREATE TABLE decimal_type_t1 (DT_COL1 DECIMAL(10,4)); |
插入数据。
1 2 |
INSERT INTO decimal_type_t1 VALUES(123456.122331); INSERT INTO decimal_type_t1 VALUES(123456.452399); |
查看数据。
1 2 3 4 5 6 |
SELECT * FROM decimal_type_t1; dt_col1 ------------- 123456.1223 123456.4524 (2 rows) |
浮点类型
浮点类型属于非精确,可变精度的数值类型。实际上,这些类型通常是对于二进制浮点算术(分别是单精度和双精度)的IEEE标准754的具体实现,在一定范围内由特定的处理器,操作系统和编译器所支持。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
REAL, FLOAT4 |
单精度浮点数,不精准。 |
4字节 |
6位十进制数字精度。 |
DOUBLE PRECISION, FLOAT8 |
双精度浮点数,不精准。 |
8字节 |
1E-307~1E+308, 15位十进制数字精度。 |
FLOAT[(p)] |
浮点数,不精准。精度p取值范围为[1,53]。
说明:
p为精度,表示总位数。 |
4字节或8字节 |
根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。 |
BINARY_DOUBLE |
是DOUBLE PRECISION的别名,为兼容Oracle类型。 |
8字节 |
1E-307~1E+308, 15位十进制数字精度。 |
DEC[(p[,s])] |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。
说明:
p为总位数,s为小数位位数。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
INTEGER[(p[,s])] |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
示例:
创建带有浮点类型的表。
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE float_type_t2 ( FT_COL1 INTEGER, FT_COL2 FLOAT4, FT_COL3 FLOAT8, FT_COL4 FLOAT(3), FT_COL5 BINARY_DOUBLE, FT_COL6 DECIMAL(10,4), FT_COL7 INTEGER(6,3) ) DISTRIBUTE BY HASH ( ft_col1); |
插入数据。
1
|
INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654); |
查看数据。
1 2 3 4 5 |
SELECT * FROM float_type_t2; ft_col1 | ft_col2 | ft_col3 | ft_col4 | ft_col5 | ft_col6 | ft_col7 ---------+---------+-------------+---------+---------+----------+--------- 10 | 10.3655 | 123456.1234 | 10.3214 | 321.321 | 123.1237 | 123.124 (1 row) |
序列整型
SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的类型,只是为在表中设置唯一标识而存在的概念。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除该序列。目前只支持在创建表时指定SERIAL列,不可以在已有的表中增加SERIAL列。另外临时表也不支持创建SERIAL列。因为SERIAL不是真正的类型,也不可以将表中存在的列类型转化为SERIAL。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
SMALLSERIAL |
二字节序列整型。 |
2字节 |
1 ~ 32,767 |
SERIAL |
四字节序列整型。 |
4字节 |
1 ~ 2,147,483,647 |
BIGSERIAL |
八字节序列整型。 |
8字节 |
1 ~ 9,223,372,036,854,775,807 |
示例:
创建带有序列类型的表。
1
|
CREATE TABLE smallserial_type_tab(a SMALLSERIAL); |
插入数据。
1
|
INSERT INTO smallserial_type_tab VALUES(default); |
再次插入数据。
1
|
INSERT INTO smallserial_type_tab VALUES(default); |
查看数据。
1 2 3 4 5 6 |
SELECT * FROM smallserial_type_tab; a --- 1 2 (2 rows) |
插入NULL值会报错。
1 2 |
INSERT INTO smallserial_type_tab VALUES(NULL); ERROR: dn_6001_6002: null value in column "a" violates not-null constraint |