
# 定点数数值类型
定点数数值类型用于精确存储数值，M-Compatibility支持的定点数数值类型如[表 定点数数值类型]所示。
 表1定点数数值类型 
| 名称                                | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 存储空间                                        | 范围（十进制位） |
|:---|:---|:---|:---|
| NUMERIC\[(p\[,s\])\] \[ZEROFILL\] | - 精度p取值范围为\[1,65\]，标度s取值范围为\[0,30\]，且标度s不大于精度p。  - 在未指定精度或标度的情况下，默认精度p为10，默认标度s为0。   | 用户声明精度。每四位（十进制位）占用两个字节，然后在整个数据上加上八个字节的额外开销。 | 最大81位数值  |
| DECIMAL\[(p\[,s\])\] \[ZEROFILL\] | 该类型映射为NUMERIC。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 用户声明精度。每四位（十进制位）占用两个字节，然后在整个数据上加上八个字节的额外开销。 | 最大81位数值  |
| DEC\[(p\[,s\])\] \[ZEROFILL\]     | 该类型映射为NUMERIC。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 用户声明精度。每四位（十进制位）占用两个字节，然后在整个数据上加上八个字节的额外开销。 | 最大81位数值  |
| FIXED\[(p\[,s\])\] \[ZEROFILL\]   | 该类型映射为NUMERIC。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 用户声明精度。每四位（十进制位）占用两个字节，然后在整个数据上加上八个字节的额外开销。 | 最大81位数值  |
   
![](https://support.huaweicloud.com/distributed-m-comp-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 精度p为数值总位数，标度s为数值小数位数。
- 输入超过标度的数值时，会报NOTICE信息，并返回截断后的值。
- sql_mode参数值包含"strict_trans_tables"时，非法输入或者输入超过精度的数值时，会报ERROR。
- sql_mode参数值不包含"strict_trans_tables"时，非法输入或者输入超过精度的数值时，会返回截断后的值或当前精度最大值。
- 支持定点数数值类型设置ZEROFILL属性：
  - 设置ZEROFILL属性时，会按照精度和标度对数值的整数位和小数位添零。如果没有设置精度、标度，会按照数据类型的默认精度、标度作为具体精度、标度。例如，对于声明为NUMERIC(10,5) ZEROFILL的列，将检索2.1的值作为00002.10000。
  
  - 设置ZEROFILL属性时，将自动添加UNSIGNED属性。
   
 
#### 示例
```
-- 创建列类型为定点数数值类型的表。
m_db=# CREATE TABLE num_tab1
(
    a NUMERIC(10,5), 
    b DECIMAL(10,5),
    c DEC(10,5),
    d FIXED(10,5)
);
-- 插入指定精度和标度范围内的数据。
m_db=# INSERT INTO num_tab1 VALUES(1234.56, 1234.56, 1234.56, 1234.56);
-- 插入超过指定标度的数据，提示notice，返回按指定标度截取小数位的数值。
m_db=# INSERT INTO num_tab1 VALUES(12.3456789, 12.3456789, 12.3456789, 12.3456789);
NOTICE:  Truncated incorrect DECIMAL value: '12.3456789'
CONTEXT:  referenced column: a
INSERT 0 1
-- 查询表中数据
m_db=# SELECT * FROM num_tab1;
     a      |     b      |     c      |     d
------------+------------+------------+------------
   12.34568 |   12.34568 |   12.34568 |   12.34568
 1234.56000 | 1234.56000 | 1234.56000 | 1234.56000
(2 rows)
-- 严格模式下插入超过指定精度的数据，报错。
m_db=# SET SQL_MODE = 'strict_trans_tables,only_full_group_by,no_zero_in_date,no_zero_date,error_for_division_by_zero,
no_auto_create_user,no_engine_substitution';
SET
m_db=# INSERT INTO num_tab1 VALUES(12345678999, 12345678999, 12345678999, 12345678999);
ERROR:  numeric field overflow
DETAIL:  A field with precision 10, scale 5 must round to an absolute value less than 10^5.
CONTEXT:  referenced column: a
-- 宽松模式下插入超过指定精度的数据,提示warning，返回指定精度下最大值。
m_db=# SET SQL_MODE = '';
SET
m_db=# INSERT INTO num_tab1 VALUES(12345678999, 12345678999, 12345678999, 12345678999);
WARNING:  numeric field overflow
DETAIL:  A field with precision 10, scale 5 must round to an absolute value less than 10^5.
CONTEXT:  referenced column: a
INSERT 0 1
-- 查询表中的数据。
m_db=# SELECT * FROM num_tab1;
      a      |      b      |      c      |      d
-------------+-------------+-------------+-------------
  1234.56000 |  1234.56000 |  1234.56000 |  1234.56000
    12.34568 |    12.34568 |    12.34568 |    12.34568
  99999.99999 | 99999.99999 | 99999.99999 | 99999.99999
(3 rows)
-- 设置zerofill属性。
m_db=# DROP TABLE IF EXISTS t1;
DROP TABLE
m_db=# CREATE TABLE t1 (a numeric zerofill);
CREATE TABLE
m_db=# INSERT INTO t1 VALUES(1);
INSERT 0 1
m_db=# SELECT * FROM t1;
     a      
------------
 0000000001
(1 row)
-- 删除表。
m_db=# DROP TABLE num_tab2;
```
