精确数值类型-Decimal 类型
Decimal 数据类型用来存储精确的数值。精确数值类型在需要用到非常准确的数值精度的场景下使用,比如银行账户数字,或者严谨的科学计算等。 在 Decimal 的列名声明中,整数和小数部分一般都会进行声明。比如以下例子:
salary DECIMAL(5,2)
在这个案例中,5 是有效数字位数,2 是小数位。整数精度表示数值部分存储的有效位数,小数精度表示小数部分存储的有效位数。 标准 SQL 要求 DECIMAL(5,2) 需要存储 5 位数字,2 位小数,因此如果以该形式表示的工资列数字取值范围应该在 -999.99 到 999.99 之间。 在 MatrixOne 的语法中,DECIMAL(M) 与 DECIMAL(M,0) 是相同的。如果直接只声明 DECIMAL 的话,语法也将解析成 DECIMAL(M,0) 的形式,M 的默认值为 10。 如果小数精度为 0 的话,DECIMAL 相当于纯整数,不含任何小数。 MatrixOne 中 DECIMAL 类型的最大位数为 38 位。另外 DECIMAL 中指定的整数或小数位数在实际列被赋值的时候超出指定范围,实际数值将会被自动转换成相应精度。
Decimal 数据类型特点
该部分内容主要介绍 Decimal 数据类型的一些特点,尤其是在位数精度和存储形式上的。
DECIMAL 列的声明语法是 DECIMAL(M, D),M 是有效数字的位数,取值范围是 1 到 38,D 是小数位数,取值范围是 1 到 38,但是不能大于 M。 如果不指定 D,默认为 0。如果不指定 M,默认为 10。
DECIMAL 列的数值以二进制的形式进行存储,在 MatrixOne 内部,只有 decimal64 和 decimal128 这两种表示形式。在 0-18 位精度内,一个 Decimal 数值占用 8 个字节的存储空间,在 19-38 位精度内,一个 Decimal 数值占用 16 个字节的存储空间。
位数 | 字节数 |
---|---|
0-18 | 8 个字节 |
19-38 | 16 个字节 |
对于详细的 Decimal 类型实现方法,可以参考 Decimal 的设计文档。