数值类型
表1列出了所有的可用类型。数字操作符和相关的内置函数请参见数字操作函数和操作符。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
TINYINT [UNSIGNED] |
微整数,带符号别名为INT1,无符号别名为UINT1。 |
1字节 |
|
SMALLINT [UNSIGNED] |
小范围整数,带符号别名为INT2,无符号别名为UINT2。 |
2字节 |
|
MEDIUMINT [UNSIGNED] |
中等范围整数,带符号别名为INT4,无符号别名为UINT4。 |
4字节 |
|
INTEGER [UNSIGNED] |
常用的整数,带符号别名为INT4,无符号别名为UINT4。 |
4字节 |
|
BINARY_INTEGER |
常用的整数,带符号别名为INTEGER。 |
4字节 |
-2,147,483,648 ~ +2,147,483,647。 |
BIGINT [UNSIGNED] |
大范围的整数,带符号别名为INT8,无符号别名为UINT8。 |
8字节 |
|
INT16 [SIGNED] |
十六字节的大范围整数,目前不支持用户用于建表等使用。 |
16字节 |
-170,141,183,460,469,231,731,687,303,715,884,105,728 ~ +170,141,183,460,469,231,731,687,303,715,884,105,727。 |
- 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'后,整型支持显示宽度和指定ZEROFILL属性。
- 显示宽度不限制可以存储在列中的值的范围,也不会阻止宽于列显示宽度的值正确显示。例如,指定为SMALLINT(3)的列可以存储-32768到32767的SMALLINT范围的值,并且使用三位以上的数字完整显示三位数所允许的范围之外的值。
- 当显示宽度与ZEROFILL属性结合使用时,将在数值前填充零以达到显示宽度。例如,对于声明为INT(4) ZEROFILL的列,将检索5的值作为0005。
- 如果为数字列指定ZEROFILL,将自动添加UNSIGNED属性。
- 如果不为数字列指定ZEROFILL,仅指明宽度信息,则宽度信息在表结构描述中不显示。
示例:
--创建数据库。 gaussdb=# CREATE DATABASE b_database dbcompatibility = 'MYSQL'; gaussdb=# \c b_database
--创建具有TINYINT类型数据的表。 b_database=# CREATE TABLE int_type_t1 ( IT_COL1 TINYINT, IT_COL2 TINYINT UNSIGNED ); --插入数据。 b_database=# INSERT INTO int_type_t1 VALUES(10,20); --查看数据。 b_database=# SELECT * FROM int_type_t1; it_col1 | it_col2 --------+--------- 10 | 20 (1 row) --删除表。 b_database=# DROP TABLE int_type_t1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
--创建具有TINYINT,INTEGER,BIGINT类型数据的表。 b_database=# CREATE TABLE int_type_t2 ( a TINYINT, b TINYINT, c INTEGER, d INTEGER UNSIGNED, e BIGINT, f BIGINT UNSIGNED ); --插入数据。 b_database=# INSERT INTO int_type_t2 VALUES(100, 10, 1000, 10000, 200, 2000); --查看数据。 b_database=# SELECT * FROM int_type_t2; a | b | c | d | e | f -----+----+------+--------+-----+------ 100 | 10 | 1000 | 10000 | 200 | 2000 (1 row) --删除表。 b_database=# DROP TABLE int_type_t2; --删除数据库。 b_database=# \c postgres gaussdb=# DROP DATABASE b_database; |
- TINYINT、SMALLINT、INTEGER、BIGINT和INT16类型存储各种范围的数字,即整数。如果存储超出范围以外的数值将会导致错误。
- 如果指定UNSIGNED,将不允许使用负值。
- 常用的类型是INTEGER,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为INTEGER的处理速度相对快得多。
- 无符号数值类型仅支持sql_compatibility = 'MYSQL'时的行存储引擎中使用。
- 当在整数值(其中一个是UNSIGNED类型)之间使用减号、加号、乘号时,结果是无符号。
- INT1/UINT1/UINT2/UINT4/UINT8的+、-、*运算允许返回值超过类型本身范围,INT2/INT4/INT8的+、-、*运算不允许返回值超过类型本身范围。
- UNSIGNED类型不支持与SET数据类型间的转换,避免对UNSIGNED类型与SET类型计算或比较。
- 当sql_compatibility = 'MYSQL'时,非数值类型的字符输入,会自动截断或返回数值0。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
NUMERIC[(p[,s])], DECIMAL[(p[,s])] |
说明:
p为总位数,s为小数位数。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
NUMBER[(p[,s])] |
NUMERIC类型的别名。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
示例:
--创建表。 gaussdb=# CREATE TABLE decimal_type_t1 ( DT_COL1 DECIMAL(10,4) ); --插入数据。 gaussdb=# INSERT INTO decimal_type_t1 VALUES(123456.122331); --查询表中的数据。 gaussdb=# SELECT * FROM decimal_type_t1; dt_col1 ------------- 123456.1223 (1 row) --删除表。 gaussdb=# DROP TABLE decimal_type_t1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
--创建表。 gaussdb=# CREATE TABLE numeric_type_t1 ( NT_COL1 NUMERIC(10,4) ); --插入数据。 gaussdb=# INSERT INTO numeric_type_t1 VALUES(123456.12354); --查询表中的数据。 gaussdb=# SELECT * FROM numeric_type_t1; nt_col1 ------------- 123456.1235 (1 row) --删除表。 gaussdb=# DROP TABLE numeric_type_t1; |
- 与整数类型相比,任意精度类型需要更大的存储空间,其存储效率、运算效率以及压缩比效果都要差一些。在进行数值类型定义时,优先选择整数类型。当数值超出整数可表示最大范围时,再选用任意精度类型。
- 使用NUMERIC/DECIMAL进行列定义时,建议指定该列的精度p以及标度s。
- 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'后,NUMERIC[(p[,s])]、DECIMAL[(p[,s])]类型的输入输出范围规格有差异。
- 输入格式:支持数字或数字字符串输入格式。
- sql_mode参数值包含“strict_trans_tables”时,非法输入或者输入超过范围时,会报错error。
- sql_mode参数值不包含“strict_trans_tables”时,非法输入或者输入超过范围时,会报warning信息,并返回0值或截断后的值。
- 输出格式:DECIMAL[(p[,s])]类型当没有指定精度和标度时与NUMERIC[(p[,s])]没有指定精度和标度时的部分输出格式存在差异。如NUMERIC无精度和标度时在类型转换时会保留小数部分,参照未设置参数的场景的输出格式,DECIMAL无精度和标度时在类型转换时则会按照精度为10,标度为0转换。
- 输入格式:支持数字或数字字符串输入格式。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
SMALLSERIAL |
二字节序列整型。 |
2字节。 |
-32,768 ~ +32,767。 |
SERIAL |
四字节序列整型。 |
4字节。 |
-2,147,483,648 ~ +2,147,483,647。 |
BIGSERIAL |
八字节序列整型。 |
8字节。 |
-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807。 |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
--创建表。 gaussdb=# CREATE TABLE smallserial_type_tab(a SMALLSERIAL); --插入数据。 gaussdb=# INSERT INTO smallserial_type_tab VALUES(default); --再次插入数据。 gaussdb=# INSERT INTO smallserial_type_tab VALUES(default); --查看数据。 gaussdb=# SELECT * FROM smallserial_type_tab; a --- 1 2 (2 rows) --创建表。 gaussdb=# CREATE TABLE serial_type_tab(b SERIAL); --插入数据。 gaussdb=# INSERT INTO serial_type_tab VALUES(default); --再次插入数据。 gaussdb=# INSERT INTO serial_type_tab VALUES(default); --查看数据。 gaussdb=# SELECT * FROM serial_type_tab; b --- 1 2 (2 rows) --创建表。 gaussdb=# CREATE TABLE bigserial_type_tab(c BIGSERIAL); --插入数据。 gaussdb=# INSERT INTO bigserial_type_tab VALUES(default); --再次插入数据。 gaussdb=# INSERT INTO bigserial_type_tab VALUES(default); --查看数据。 gaussdb=# SELECT * FROM bigserial_type_tab; c --- 1 2 (2 rows) --删除表。 gaussdb=# DROP TABLE smallserial_type_tab; gaussdb=# DROP TABLE serial_type_tab; gaussdb=# DROP TABLE bigserial_type_tab; |
SMALLSERIAL、SERIAL和BIGSERIAL类型不是真正的类型,只是为在表中设置唯一标识做的概念上的便利。因此,创建一个整数字段,设置其缺省数值从一个序列发生器读取。使用NOT NULL约束以确保NULL不会被插入。在多数情况下,用户可能还希望附加UNIQUE或PRIMARY KEY约束,避免插入重复的数值。最后,序列发生器将从属于该字段,当该字段或表被删除时,序列发生器会同时删除。目前只支持在创建表时候指定SERIAL列,不可以在已有的表中增加SERIAL列。另外,临时表也不支持创建SERIAL列,因为SERIAL不是真正的类型,所以不可以将表中存在的列类型转化为SERIAL。
浮点类型如表4所示。
- 浮点类型中REAL(p,s)、DOUBLE、DOUBLE(p,s)和FLOAT(p,s)数据类型,需要在sql_compatibility = 'MYSQL'时,设置b_format_version = '5.7'和b_format_dev_version = 's1'后才能使用。REAL、FLOAT、DEC[(p[,s])]数据类型,在sql_compatibility = 'MYSQL'时,设置b_format_version = '5.7'和b_format_dev_version = 's1'后的行为见表4具体描述。
- 表4中描述的p为精度,表示整数位最低可以接受的总位数;s为小数位位数。
名称 |
描述 |
存储空间 |
范围 |
---|---|---|---|
REAL, FLOAT4 |
单精度浮点数,不精准。 REAL数据类型在满足说明中的场景下,映射为双精度浮点数FLOAT8,使用场景参考FLOAT8。 |
4字节。 |
-3.402E+38~+3.402E+38,6位十进制数字精度。 |
REAL(p,s) |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。 未指定精度和标度的情况下,默认精度p为10,标度s为0。 该类型映射为NUMERIC,使用场景参考NUMERIC。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
在精度和标度指定最大的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
DOUBLE PRECISION, FLOAT8 |
双精度浮点数,不精准。 |
8字节。 |
-1.79E+308~+1.79E+308,15位十进制数字精度。 |
DOUBLE |
双精度浮点数,不精准。 该类型映射为双精度浮点数FLOAT8,使用场景参考FLOAT8。 |
8字节。 |
-1.79E+308~+1.79E+308,15位十进制数字精度。 |
DOUBLE(p,s) |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。 未指定精度和标度的情况下,默认精度p为10,标度s为0。 该类型映射为NUMERIC,使用场景参考NUMERIC。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
在精度和标度指定最大的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
FLOAT[(p)] |
浮点数,不精准。精度p取值范围为[1,53]。 根据精度p不同选择,p<=24时映射为REAL类型,p>24时映射为DOUBLE PRECISION类型,不指定精度时,映射为DOUBLE PRECISION类型。 在满足说明中的场景下,精度p<=24时映射为FLOAT4类型,p>24时映射为DOUBLE PRECISION类型,不指定精度时,映射为FLOAT4类型。 |
4字节或8字节。 |
- |
FLOAT(p,s) |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。 在未指定精度和标度的情况下,默认精度p为10,标度s为0。 该类型映射为NUMERIC,使用场景参考NUMERIC。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
在精度和标度指定最大的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
BINARY_DOUBLE |
是DOUBLE PRECISION的别名,为兼容Oracle数据库类型。 |
8字节。 |
-1.79E+308~+1.79E+308,15位十进制数字精度。 |
DEC[(p[,s])] |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。 在满足说明中的场景且未指定精度和标度的情况下,默认精度p为10,标度s为0。 该类型映射为NUMERIC,使用场景参考NUMERIC。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
在精度和标度指定最大的情况下,小数点前最大131,072位,小数点后最大16,383位。 |
INTEGER[(p[,s])] |
精度p取值范围为[1,1000],标度s取值范围为[0,p]。 在未指定精度和标度的情况下,默认精度p为10,标度s为0。 未指定精度和标度的情况下,该类型映射为INTEGER。指定精度和标度的情况下,该类型映射为NUMERIC。 |
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
在精度和标度指定最大的情况下,小数点前最大131,072位,小数点后最大16,383位。 未指定精度和标度的情况下,范围是-2,147,483,648 ~ +2,147,483,647。 |
- 二进制浮点数据类型REAL、FLOAT4、DOUBLE、DOUBLE PRECISION、FLOAT8、FLOAT[(p)]和BINARY_DOUBLE为不精确的数值类型,其内部存储为近似值,因此存储和检索时可能会显示轻微的差异。当用户在使用二进制浮点数据类型时需要注意以下几点:
- 精确存储和计算:如果需要精确存储和计算(例如货币金额),请改用精确的数据类型(例如numeric)。
- 复杂计算:若使用不精确的数据类型执行复杂计算以获得重要数据,需要仔细评估其结果。
- 浮点数比较:比较两个浮点数是否相等的结果可能与预期存在差异。
- 下溢错误:如果一个浮点数太过接近零,反而无法准确表示,会导致下溢错误。
- 关于浮点类型的精度,目前只能保证直接读取时的精度位数。涉及分布式计算时,由于计算执行在各个DN节点上,并且最终汇聚到一个CN节点,因此误差可能会随计算节点数量增加而被放大。
- 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'后,FLOAT[(p[,s])]、DOUBLE[(p[,s])]、DEC[(p[,s])]、REAL[(p[,s])]类型的输入输出范围规格有差异。
- 输入格式:支持数字或数字字符串输入格式。
- sql_mode参数值包含“strict_trans_tables”时,非法输入或者输入超过范围时,会报错error。
- sql_mode参数值不包含“strict_trans_tables”时,非法输入或者输入超过范围时,会报warning信息,并返回0值或截断后的值。
- 输出格式:DEC[(p[,s])]类型当没有指定精度和标度时与其映射的NUMERIC[(p[,s])]类型在没有指定精度和标度时的部分输出格式场景存在差异。如NUMERIC无精度和标度时在类型转换时会保留小数部分,参照未设置参数的场景的输出格式,DEC无精度和标度时在类型转换时则会按照精度为10,标度为0转换。
- 输入格式:支持数字或数字字符串输入格式。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
--创建表。 gaussdb=# 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); --插入数据。 gaussdb=# INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654); --查看数据。 gaussdb=# 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) --删除表。 gaussdb=# DROP TABLE float_type_t2; --示例:REAL(p,s)、FLOAT(p,s)、DOUBLE、DOUBLE(p,s)类型。 gaussdb=# CREATE DATABASE gaussdb_m WITH dbcompatibility 'MYSQL'; gaussdb=# \c gaussdb_m --设置兼容版本控制参数。 gaussdb_m=# SET b_format_version='5.7'; gaussdb_m=# SET b_format_dev_version='s1'; --创建表。 gaussdb_m=# CREATE TABLE t1(a real(10,2), b float(10,2), c double, d double(10,2)); --插入数据。 gaussdb_m=# INSERT INTO t1 VALUES (1000.12, 2000.23, 3000.34, 4000.45); --查询表中数据。 gaussdb_m=# SELECT * FROM t1; a | b | c | d ---------+---------+---------+--------- 1000.12 | 2000.23 | 3000.34 | 4000.45 (1 row) --删除表和数据库。 gaussdb_m=# DROP TABLE t1; gaussdb_m=# \c postgres; gaussdb=# DROP DATABASE gaussdb_m; --重置参数。 gaussdb=# RESET ALL; |