数据库服务器使用一个字节的磁盘存储空间来存储两位十进制数,并加上一个字节来存储指数和符号(第一个字节用 excess-65 格式表示一个符号位和 7 位指数)。余下的字节将尾数表示为 base-100 位。小数点左边的有效位和小数点右边的有效位存储在独立的字节组中。当使用最大精度规范时,DECIMAL(32,s) 数据类型可在小数点右边存储 s-1 个小数位数(如果 s 是奇数)。
在下面的示例中说明了数据库服务器存储小数的方式。如果指定 DECIMAL(6,3),那么数据类型由整数部分中的三个有效位和小数部分中的三个有效位组成(例如:123.456)。小数点左边的三位存储在 2 个字节上(其中一个字节只保存一位),小数点右边的三位存储在另外 2 个字节上,如图 1 所示。
图: 说明 Decimal (p,s) 值中数位存储的示意图
如果小数位为奇数:N = (精度 + 4) / 2 如果小数位为偶数:N = (精度 + 3) / 2
例如,数据类型 DECIMAL(5,3) 需要 4 个字节的存储空间(9/2 下舍入等于 4)。
使用这些公式时要注意一点。数据库服务器用来存储小数值的最大字节数是 17。一个字节用来存储指数和符号,其余的 16 个字节用来存储最多 32 位精度。但是,如果指定精度 32 和奇数小数位,那么会丢失 1 位精度。例如,考虑数据类型 DECIMAL(32,31)。将此小数定义为小数点左边 1 位,小数点右边 31 位。小数点左边的 1 位需要 1 个字节的存储器。这使得只留下 15 个字节的存储器给小数点右边的位。15 个字节只能容纳 30 位,因此丢失 1 位精度。