24.2. DECIMAL数据类型更改
本节讨论了MySQL 5.1中DECIMAL数据类型(以及其同义类型)的特性,尤其是下述方面:
·数字的最大数。
·存储格式。
·存储要求。
·对DECIMAL列上界 的非标准MySQL扩展。
在本节中,对于为较早MySQL版本编写的应用程序,在相应的地方指出了可能的不兼容性。
DECIMAL列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下:
·M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254)。
·D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过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)列支持的范围为-999~999。对于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参考手册。