更新时间:2025-09-12 GMT+08:00
分享

定点数数值类型

定点数数值类型用于精确存储数值,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位数值。

  • 精度p为数值总位数,标度s为数值小数位数。
  • 输入超过标度的数值时,会报notice信息,并返回截断后的值。
  • sql_mode参数值包含“strict_trans_tables”时,非法输入或者输入超过精度的数值时,会报error。
  • sql_mode参数值不包含“strict_trans_tables”时,非法输入或者输入超过精度的数值时,会报warning信息,并返回截断后的值或当前精度最大值。
  • 支持定点数数值类型设置ZEROFILL属性:
    • 设置ZEROFILL属性时,会按照精度和标度对数值的整数位和小数位添零。如果没有设置精度、标度,会按照数据类型的默认精度、标度作为具体精度、标度。例如,对于声明为NUMERIC(10,5) ZEROFILL的列,将检索2.1的值作为00002.10000。
    • 设置ZEROFILL属性时,将自动添加UNSIGNED属性。

示例

 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
-- 创建列类型为定点数数值类型的表。
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
NOTICE:  Truncated incorrect DECIMAL value: '12.3456789'
CONTEXT:  referenced column: b
NOTICE:  Truncated incorrect DECIMAL value: '12.3456789'
CONTEXT:  referenced column: c
NOTICE:  Truncated incorrect DECIMAL value: '12.3456789'
CONTEXT:  referenced column: d
INSERT 0 1

-- 严格模式下插入超过指定精度的数据,报错。
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
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: b
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: c
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: d
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;

相关文档