数值类型
精确值运算的精度数学范围包括精确值数据类型(整数和DECIMAL
类型)和精确值数字文字。近似值数据类型和数字文字作为浮点数处理。
精确值数字文字具有整数部分或小数部分,或两者都有。它们可能已签名。例如:1
,.2
,3.4
,-5
,-6.78
,+9.10
。
近似值数字文字以科学计数法表示,并带有尾数和指数。这两个部分中的一个或两个都可以签名。例如:1.2E3
,1.2E-3
,-1.2E3
,-1.2E-3
。
看起来相似的两个数字可能会有所不同。例如,2.34
是一个精确值(定点)数字,而是2.34E0
一个近似值(浮点)数字。
DECIMAL
数据类型是一个定点类型和计算是精确的。在MySQL中,DECIMAL
类型有多个同义词:NUMERIC
,DEC
,FIXED
。整数类型也是精确值类型。
该FLOAT
和DOUBLE
数据类型是浮点类型,其计算是近似的。在MySQL中,类型与同义FLOAT
或DOUBLE
有DOUBLE PRECISION
和REAL
。
DECIMAL数据类型特征
本节讨论DECIMAL
数据类型(及其同义词)的特征,特别是以下主题:
- 最大位数
- 储存格式
- 储存要求
- 非标准MySQL扩展到
DECIMAL
列的上限
DECIMAL
列的声明语法为。自变量的值范围如下:DECIMAL(M,D)
M
是最大位数(精度)。范围是1到65。D
是小数点右边的位数(小数位数)。范围是0到30,并且不能大于M
。
如果D
省略,则默认值为0。如果M
省略,则默认值为10。
最大值65 M
表示对DECIMAL
值的计算最多可精确到65位。此65位精度的限制也适用于精确值数字文字,因此此类文字的最大范围与以前有所不同。
DECIMAL
列的值使用二进制格式存储,该格式将9个十进制数字打包为4个字节。每个值的整数和小数部分的存储要求分别确定。九位数的每个倍数需要4个字节,剩余的任何剩余位数都需要4字节的一部分。下表列出了剩余数字所需的存储量。
剩余数字 | 字节数 |
---|---|
0 | 0 |
1–2 | 1个 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
例如,一DECIMAL(18,9)
列在小数点的任一侧都有9位数字,因此整数部分和小数部分每个都需要4个字节。一DECIMAL(20,6)
列有十四个整数数字和六个小数位数。整数位中的9位需要4个字节,其余5位需要3个字节。六个小数位需要3个字节。
DECIMAL
列不存储前导+
字符或-
字符或前导0
数字。如果插入+0003.1
到一个DECIMAL(5,1)
列,它被存储为3.1
。对于负数,-
不存储文字字符。
DECIMAL
列不允许大于列定义所隐含范围的值。例如,一DECIMAL(3,0)
列支持的范围为-999
至999
。一列允许小数点左边最多-位。DECIMAL(M,D)
M
D
SQL标准要求的精确度是准确数字。对于,该标准要求至少为几位的精度,但允许更高的精度。在MySQL中,和相同,并且都具有精确的数字精度。NUMERIC(M,D)
M
DECIMAL(M,D)
M
DECIMAL(M,D)
NUMERIC(M,D)
M
有关DECIMAL
值的内部格式的完整说明,请参见strings/decimal.c
MySQL源代码分发中的文件。在decimal2bin()
函数中解释了格式(带有示例)。