定点类数据类型
定点数据类型确保乘法和除法操作的可预测性,可以使用它们的选择存储货币值。Firebird实现两个定点数据类型:数值( NUMERIC)和小数(DECIMAL)。根据标准,这两种类型将存储数据限定为声明的小数(数量数字后的数字小数点)。
不同的处理方法对各类型的精度都有不同的限制:数值列的精度完全是“声明的",尽管十进制列接受数据的精度至少等于它被声明的精度。
例如,DECIMAL(4,2)定义了一个数值,其中包括了四个数字,包括2位小数点数字,即可以有2位数字在小数点前面和不超过2位数字在小数点面。如果将3.1415号写入到该数据类型定义的列,则将保存3.14的值在DECIMAL(4,2)列。
定点数据声明的形式,例如,NUMERIC(p, s)是两种类型中常见的,必须意识到在这个模板中的s参数的重要性,而不仅是“小数点后的位数”。理解这种机制来存储和检索定点数据应该可以帮助想象为什么:存储的数值乘以10的s次方(10的指数为s)转换后的整数,当阅读时整数被转换回来,将它转换为一个整数。
这种在数据库管理系统中存储定点数据的方式依赖于几个因素:声明的精度,数据库方言,声明的类型.
表3.2物理存储为实数的方法
小数位数 | 数据类型 | 方言1 | 方言2 |
1 - 4 | 数值型NUMBERIC | 短整型SMALLINT | 短整型SMALLINT |
1 - 4 | 小数型DECIMAL | 整型INTEGER | 整型INTEGER |
5 - 9 | 数值型NUMBERIC或小数型DECIMAL | 整型INTEGER | 整型INTEGER |
10 - 18 | 数值型NUMBERIC或小数型DECIMAL | 双精型DOUBLE PRECISION | 大整型BIGINT |
数值型NUMERIC
数据声明格式t:
NUMERIC(p, s)
存储例子: 进一步解释上述,DBMS将根据声明的精度(p)和小数位数(s)来存储数值型数据据。更多的一些例子如:
NUMERIC(4) 作为 SMALLINT (准确的数据)存储
NUMERIC(4,2) 作为 SMALLINT (数据乘以10的2次方)存储
NUMERIC(10,4) 在方言1中以 DOUBLE PRECISION存储
在方言1中以 BIGINT (数据乘以10的4次方)存储
警告
永远记住,存储格式取决于精度。例如,假设你定义一个列的类型为NUMERIC(2,2),它的值范围将是-0.99...0.99.然而实际值范围将是-327.68...327.67,这是因为存储NUMERIC(2,2) 数据类型在 SMALLINT 中,实际上在存储NUMERIC(4,2), NUMERIC(3,2) 和 NUMERIC(2,2)数据类型都是一样的。这就意味着如果你真的想存储在数据列NUMERIC(2,2)的数据范围在 -0.99...0.99之间,你将不得不为它建立一个约束。
小数型DECIMAL
数据声明格式t:
DECIMAL(p, s)
存储例子: 小数型存储在数据库中的格式同数值型非常相似,在一些例子的帮助下容易观察到它们的不同之处:
DECIMAL(4) 作为 INTEGER (准确的数据)存储
DECIMAL(4,2) INTEGER (数据乘以10的2次方)存储
DECIMAL(10,4) 在方言1中以 DOUBLE PRECISION存储
在方言1中以 BIGINT (数据乘以10的4次方)存储