
# 数值类型
[表1]列出了所有的可用类型。数字操作符和相关的内置函数请参见[数字操作函数和操作符](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0362.html#ZH-CN_TOPIC_0000002559107915)。
 表1整数类型 
| 名称                     | 描述                             | 存储空间 | 范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
|:---|:---|:---|:---|
| TINYINT \[UNSIGNED\]   | 微整数，带符号别名为INT1，无符号别名为UINT1。    | 1字节  | - 带符号的范围是0 \~ +255。  - 无符号的范围是0 \~ +255。  - 当sql_compatibility = 'B'时，设置参数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的别名，为兼容A数据库类型。 | 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。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 当sql_compatibility = 'B'时，设置参数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 = 'B';
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;
```
```
--创建具有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;
```
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- TINYINT、SMALLINT、INTEGER、BIGINT和INT16类型存储各种范围的数字，即整数。如果存储超出范围以外的数值将会导致错误。
- 如果指定UNSIGNED，将不允许使用负值。
- 常用的类型是INTEGER，因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有取值范围确定不超过SMALLINT的情况下，才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT，因为前者相对快得多。
- 无符号数值类型仅支持在sql_compatibility = 'B'时的行存储引擎中使用。
- 当在整数值（其中一个是UNSIGNED类型）之间使用减号、加号、乘号时，结果是无符号。
- INT1/UINT1/UINT2/UINT4/UINT8的+、-、\*运算允许返回值超过类型本身范围，INT2/INT4/INT8的+、-、\*运算不允许返回值超过类型本身范围。
- UNSIGNED类型不支持与SET数据类型间的转换，避免对UNSIGNED类型与SET类型计算或比较。
- 当sql_compatibility = 'B'时，非数值类型的字符输入，会自动截断或返回数值0。
 
表2任意精度类型 
| 名称                                                                                                                                                                                                             | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 存储空间                                        | 范围                                      |
|:---|:---|:---|:---|
| NUMERIC\[(p\[,s\])\], DECIMAL\[(p\[,s\])\] | - 精度p取值范围为\[1,1000\]，标度s取值范围为\[0,p\]。  - 当sql_compatibility = 'B'时，设置参数b_format_version = '5.7'和参数b_format_dev_version = 's1'后，在未指定精度和标度的情况下，默认精度p为10，标度s为0。NUMERIC不带括号时，只在设置表列数据类型的时候指定为NUMERIC(10,0)，其他场景默认NUMERIC类型按原来范围使用。   说明： - p为总位数，s为小数位数。  - 当插入数据小数位数超过定义标度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;
--创建表。
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=# INSERT INTO numeric_type_t1 VALUES(10000.12355);
--查询表中的数据。
gaussdb=# SELECT * FROM numeric_type_t1;
   nt_col1   
-------------
 123456.1235
  10000.1236
(2 rows)
--删除表。
gaussdb=# DROP TABLE numeric_type_t1;
```
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 与整数类型相比，任意精度类型需要更大的存储空间，其存储效率、运算效率以及压缩比效果都要差一些。在进行数值类型定义时，优先选择整数类型。当且仅当数值超出整数可表示最大范围时，再选用任意精度类型。
- 使用NUMERIC/DECIMAL进行列定义时，建议指定该列的精度p以及标度s。
- 当sql_compatibility = 'B'时，设置参数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。 |
| LARGESERIAL | 默认插入十六字节序列整型，实际数值类型和NUMERIC相同。 | 变长类型，每四位（十进制位）占用两个字节，然后在整个数据上加上八个字节的额外开销。 | 小数点前最大131,072位，小数点后最大16,383位。                             |
   
示例：
```
--创建表。
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=# CREATE TABLE largeserial_type_tab(c LARGESERIAL);
--插入数据。
gaussdb=# INSERT INTO largeserial_type_tab VALUES(default);
--再次插入数据。
gaussdb=# INSERT INTO largeserial_type_tab VALUES(default);
--查看数据。
gaussdb=# SELECT * FROM largeserial_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;
```
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
SMALLSERIAL、SERIAL、BIGSERIAL和LARGESERIAL类型不是真正的类型，只是为在表中设置唯一标识做的概念上的便利。因此，创建一个整数字段，并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值，但这个不是自动的。最后，序列发生器将从属于该字段，这样当该字段或表被删除的时候也一并删除它。目前支持在创建表时候指定SERIAL列，也支持在PG兼容模式下的普通表增加SERIAL列。另外临时表也不支持创建SERIAL列。因为SERIAL不是真正的类型，所以也不可以将表中存在的列类型转化为SERIAL。
浮点类型如[表4]所示。
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 浮点类型中REAL(p,s)、DOUBLE、DOUBLE(p,s)和FLOAT(p,s)数据类型，需要在sql_compatibility = 'B'时，设置b_format_version = '5.7'和b_format_dev_version = 's1'后才能使用。REAL、FLOAT、DEC\[(p\[,s\])\]数据类型，在sql_compatibility = 'B'时，设置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。  |
   
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 二进制浮点数据类型REAL、FLOAT4、DOUBLE、DOUBLE PRECISION、FLOAT8、FLOAT\[(p)\]和BINARY_DOUBLE为不精确的数值类型，其内部存储为近似值，因此存储和检索时可能会显示轻微的差异。当用户在使用二进制浮点数据类型时需要注意以下几点：
  - 精确存储和计算：如果需要精确存储和计算（例如货币金额），请改用精确的数据类型（例如numeric）。
  
  - 复杂计算：若使用不精确的数据类型执行复杂计算以获得重要数据，需要仔细评估其结果。
  
  - 浮点数比较：比较两个浮点数是否相等的结果可能与预期存在差异。
  
  - 下溢错误：如果一个浮点数过于接近零，反而无法准确表示，会导致下溢错误。
   

- 当sql_compatibility = 'B'时，设置参数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转换。
   
 
示例：
```
--创建表。
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)
);
--插入数据。
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  'B';
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;
```
