更新时间:2024-12-19 GMT+08:00
分享

数值类型

表1列出了所有的可用类型。数字操作符和相关的内置函数请参见数字操作函数和操作符

表1 整数类型

名称

描述

存储空间

范围

TINYINT [UNSIGNED]

微整数,带符号别名为INT1,无符号别名为UINT1。

1字节

  • 带符号的范围是0 ~ +255。
  • 无符号的范围是0 ~ +255。
  • 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'后,带符号的范围是-128 ~ +127。

SMALLINT [UNSIGNED]

小范围整数,带符号别名为INT2,无符号别名为UINT2。

2字节

  • 带符号的范围是-32,768 ~ +32,767。
  • 无符号的范围是0 ~ +65,535。

MEDIUMINT [UNSIGNED]

中等范围整数,带符号别名为INT4,无符号别名为UINT4。

4字节

  • 带符号的范围是-2,147,483,648 ~ +2,147,483,647。
  • 无符号的范围是0 ~ +4,294,967,295。

INTEGER [UNSIGNED]

常用的整数,带符号别名为INT4,无符号别名为UINT4。

4字节

  • 带符号的范围是-2,147,483,648 ~ +2,147,483,647。
  • 无符号的范围是0 ~ +4,294,967,295。

BINARY_INTEGER

常用的整数,带符号别名为INTEGER。

4字节

-2,147,483,648 ~ +2,147,483,647。

BIGINT [UNSIGNED]

大范围的整数,带符号别名为INT8,无符号别名为UINT8。

8字节

  • 带符号的范围是-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807。
  • 无符号的范围是0 ~ +18,446,744,073,709,551,615。

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。
表2 任意精度类型

名称

描述

存储空间

范围

NUMERIC[(p[,s])],

DECIMAL[(p[,s])]

  • 精度p取值范围为[1,1000],标度s取值范围为[0,p]。
  • 当sql_compatibility = 'MYSQL'时,设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'后,在未指定精度和标度的情况下,默认精度p为10,标度s为0。numeric不带括号时,只在设置表列数据类型的时候指定为numeric(10,0),其他场景默认numeric类型按原来范围使用。
说明:

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转换。
表3 序列整型

名称

描述

存储空间

范围

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为小数位位数。
表4 浮点类型

名称

描述

存储空间

范围

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;

相关文档