定点数数值类型
定点数数值类型用于精确存储数值,M-Compatibility支持的定点数数值类型请参见表 定点数数值类型。
|
名称 |
描述 |
存储空间 |
范围 |
|---|---|---|---|
|
NUMERIC[(p[,s])] [ZEROFILL] |
|
用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 |
(十进制位)最大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; |