浮点数数值类型
浮点数数值类型用于存储数值,存储的是近似值。M-Compatibility支持的浮点数数值类型请参见表 浮点数数值类型。
|
名称 |
描述 |
存储空间 |
范围 |
|---|---|---|---|
|
FLOAT4[(p, s)] [ZEROFILL] |
单精度浮点数,不精准。 精度p取值范围为[1,255],标度s取值范围为[0,min(p, 30)]。 |
4字节。 |
-3.402E+38~3.402E+38,6位十进制数字精度。 |
|
FLOAT8[(p,s)] [ZEROFILL] |
双精度浮点数,不精准。 精度p取值范围为[1,255],标度s取值范围为[0,min(p, 30)]。 |
8字节。 |
-1.79E+308~1.79E+308,15位十进制数字精度。 |
|
FLOAT[(p)] [ZEROFILL] |
p取值范围为[0,53]。
|
当p取值为[0, 25)时,4字节,当p取值为[25, 54)时,8字节。 |
当p取值为[0, 25)时,取值范围同FLOAT4,当p取值为[25, 54)时,取值范围同FLOAT8。 |
|
REAL[(p, s)] [ZEROFILL] |
按DOUBLE[(p, s)]存储,行为同DOUBLE[(p, s)]。 sql_mode设置REAL_AS_FLOAT时,按FLOAT[(p, s)]存储,行为同FLOAT8[(p, s)]。 |
8字节。 sql_mode设置REAL_AS_FLOAT时,4字节。 |
-1.79E+308~1.79E+308,15位十进制数字精度。 sql_mode设置REAL_AS_FLOAT时,-3.402E+38~3.402E+38,6位十进制数字精度。 |
|
FLOAT[(p, s)] [ZEROFILL] |
该类型映射为FLOAT4[(p,s)]。精度p取值范围为[1,255],标度s取值范围为[0,min(p, 30)]。 |
4字节。 |
-3.402E+38~3.402E+38,6位十进制数字精度。 |
|
DOUBLE[(p,s)] [ZEROFILL] |
该类型映射为FLOAT8[(p,s)]。精度p取值范围为[1,255],标度s取值范围为[0,min(p, 30)]。 |
8字节。 |
-1.79E+308~1.79E+308,15位十进制数字精度。 |
|
DOUBLE PRECISION[(p,s)] [ZEROFILL] |
该类型映射为FLOAT8[(p,s)]。精度p取值范围为[1,255],标度s取值范围为[0,min(p, 30)]。 |
8字节。 |
-1.79E+308~1.79E+308,15位十进制数字精度。 |
- 精度p为数值总位数,标度s为数值小数位数。
- 输入超过标度的数值时,会返回截断后的值。
- 未设置精度时,字段的范围如表1所示的范围,设置了精度时字段的范围以设置的精度为准。
- sql_mode参数值包含“strict_trans_tables”时,非法输入或者输入超过精度的数值时,会报error。
- sql_mode参数值不包含“strict_trans_tables”时,非法输入或者输入超过精度的数值时,会报warning信息,并返回截断后的值或当前精度最大值。
- sql_mode参数包含“real_as_float”时,real类型按float类型存储,行为和float类型一致。
- sql_mode参数不包含“real_as_float”时,real类型按double类型存储,行为和double类型一致。
- 支持浮点数数值类型设置ZEROFILL属性:
- 设置ZEROFILL属性时,会按照精度和标度对数值的整数位和小数位添零。例如,对于声明为FLOAT(10,5) ZEROFILL的列,将检索2.1的值作为0002.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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
-- 创建列类型为浮点数数值类型的表。 m_db=# CREATE TABLE float_tab1 ( a FLOAT(6,2), b DOUBLE(6,2) ); -- 插入指定精度和标度范围内的数据。 m_db=# INSERT INTO float_tab1 VALUES(1234.56, 1234.56); -- 插入超过指定标度的数据,返回按指定标度截取小数位的数值。 m_db=# INSERT INTO float_tab1 VALUES(12.3456789, 12.3456789); -- 严格模式下插入超过指定精度的数据,报错。 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 float_tab1 VALUES(12345678999, 12345678999); ERROR: float field overflow DETAIL: A field with precision 6, scale 2 must round to an absolute value less than 9.9999900e+03. CONTEXT: referenced column: a -- 宽松模式下插入超过指定精度的数据,提示warning,返回指定精度下最大值。 m_db=# SET SQL_MODE = ''; SET m_db=# INSERT INTO float_tab1 VALUES(12345678999, 12345678999); WARNING: float field overflow DETAIL: A field with precision 6, scale 2 must round to an absolute value less than 9.9999900e+03. CONTEXT: referenced column: a WARNING: float field overflow DETAIL: A field with precision 6, scale 2 must round to an absolute value less than 9.9999899999999998e+03. CONTEXT: referenced column: b INSERT 0 1 -- 查询表中的数据。 m_db=# SELECT * FROM float_tab1; a | b ---------+--------- 1234.56 | 1234.56 12.35 | 12.35 9999.99 | 9999.99 (3 rows) -- 删除表。 m_db=# DROP TABLE float_tab1; -- SQL_MODE没设置REAL_AS_FLOAT时创建列类型为real类型的表。 m_db=# SET SQL_MODE=''; SET m_db=# CREATE TABLE real_tab1(a REAL); -- 插入数据。 m_db=# INSERT INTO real_tab1 VALUES(12345.678999999999); -- 查询表中的数据,结果同DOUBLE类型,精确显示12位。 m_db=# SELECT * FROM real_tab1; a --------- 12345.678999999998 (1 row) -- 删除表。 m_db=# DROP TABLE real_tab1; -- SQL_MODE设置REAL_AS_FLOAT时创建列类型为real类型的表。 m_db=# SET SQL_MODE='REAL_AS_FLOAT'; SET m_db=# CREATE TABLE real_tab2(a REAL); -- 插入数据。 m_db=# INSERT INTO real_tab2 VALUES(12345.678999999999); -- 查询表中的数据,结果同FLOAT类型,精确显示6位。 m_db=# SELECT * FROM real_tab2; a --------- 12345.7 (1 row) -- 设置zerofill属性。 m_db=# DROP TABLE IF EXISTS t1; DROP TABLE m_db=# CREATE TABLE t1 (a float zerofill); CREATE TABLE m_db=# INSERT INTO t1 VALUES(1); INSERT 0 1 m_db=# SELECT * FROM t1; a -------------- 000000000001 (1 row) -- 删除表。 m_db=# DROP TABLE real_tab2; |