第24章:精度数学 / 24.2. DECIMAL数据类型更改

本节讨论了MySQL 5.1DECIMAL数据类型(以及其同义类型)的特性,尤其是下述方面:

·         数字的最大数。

·         存储格式。

·         存储要求。

·         DECIMAL列上界 的非标准MySQL扩展。

在本节中,对于为较早MySQL版本编写的应用程序,在相应的地方指出了可能的不兼容性。

DECIMAL列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下:

·         M是数字的最大数(精度)。其范围为165(在较旧的MySQL版本中,允许的范围是1254)。

·         D是小数点右侧数字的数目(标度)。其范围是030,但不得超过M

对于M,最大值65意味着,对DECIMAL值的计算能精确到65位数字。这种65位数字的精度限制也适用于准确值数值文字,因此,这类文字值的最大范围不同于以前的范围(在较早的MySQL版本中,十进制值能达到254位。不过,采用的是浮点计算,因而是近似计算而不是准确计算)。

MySQL 5.1中,采用二进制格式保存DECIMAL列的值,将9个十进制数字打包在4字节中。对于每个值的整数部分和小数部分,其存储要求是分别确定的。每9个数字需要4字节,任何剩余的数字将占用4字节的一部分。例如,DECIMAL(18,9)列在小数点的每一侧均有9位数字,因此,整数部分和小数部分均需要4字节。DECIMAL(20,10)列在小数点的每一侧均有10位数字。对于每一部分,9位数字需要4字节,剩余的1位数字需要1字节。

在下表中,给出了关于剩余数字的存储要求:

剩余的数字

字节数

0

0

1

1

2

1

3

2

4

2

5

3

6

3

7

4

8

4

9

4

与某些较早的MySQL版本不同,在MySQL 5.1中,DECIMAL列不保存前导“+”字符或前导“0”数字。如果将+0003.1插入DECIMAL(5,1)列,将保存为3.1。为了适应该变化,必须更改依赖于早期行为的应用程序。

MySQL 5.1中,DECIMAL列不允许保存大于列定义中隐含范围的值。例如,DECIMAL(3,0)列支持的范围为-999999。对于DECIMAL(M,D)列,小数点左侧最多允许M D位数字(它与依赖于早期MySQL版本的应用程序不兼容,允许保存额外数字代替“+”号)。

SQL标准要求,NUMERIC(M,D)的精度必须准确为M位数字。对于DECIMAL(M,D),标准要求的精度至少为M位数字,但允许更多。在MySQL中,DECIMAL(M,D)NUMERIC(M,D)是相同的,两者的精度均准确为M位数字。

对于依赖DECIMAL数据类型早期处理方式的应用程序,关于移植这类应用程序的更多信息,请参见MySQL 5.0参考手册。