本节讨论 DECIMAL
数据类型(及其同义词)的特征,特别关注以下主题
最大位数
存储格式
存储需求
对
DECIMAL
列的非标准 MySQL 扩展
用于 DECIMAL
列的声明语法为 DECIMAL(
。参数的值范围如下M
,D
)
M
是最大位数(精度)。其范围为 1 到 65。D
是小数点右边的位数(刻度)。其范围为 0 到 30,并且不能大于M
。
如果省略 D
,则默认值为 0。如果省略 M
,则默认值为 10。
M
的最大值为 65,这意味着对 DECIMAL
值的计算精确到 65 位。此精度限制 65 位也适用于精确值数值字面量,因此此类字面量的最大范围与之前不同。(对 DECIMAL
字面量的文本长度也有限制;请参见 第 14.25.3 节,“表达式处理”。)
DECIMAL
列的值使用二进制格式存储,该格式将九个十进制数字打包到 4 字节中。每个值的整数部分和小数部分的存储需求是分别确定的。每九个数字的倍数都需要 4 字节,而剩余的任何数字都需要 4 字节的一部分。下表给出了剩余数字所需的存储空间。
剩余数字 | 字节数 |
---|---|
0 | 0 |
1–2 | 1 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
例如,DECIMAL(18,9)
列在小数点两侧各有九个数字,因此整数部分和小数部分都需要 4 字节。DECIMAL(20,6)
列有十四个整数位和六个小数位。整数位需要四个字节用于九位数字,以及三个字节用于剩余的五位数字。六个小数位需要三个字节。
DECIMAL
列不存储前导 +
字符或 -
字符或前导 0
数字。如果将 +0003.1
插入到 DECIMAL(5,1)
列中,它将存储为 3.1
。对于负数,字面量 -
字符不会存储。
DECIMAL
列不允许大于列定义所暗示范围的值。例如,DECIMAL(3,0)
列支持的范围为 -999
到 999
。DECIMAL(
列允许在小数点左侧最多有 M
,D
)M
- D
个数字。
SQL 标准要求 NUMERIC(
的精度 完全 为 M
,D
)M
位。对于 DECIMAL(
,该标准要求精度至少为 M
,D
)M
位,但允许更多。在 MySQL 中,DECIMAL(
和 M
,D
)NUMERIC(
相同,两者都具有完全为 M
,D
)M
位的精度。
有关 DECIMAL
值内部格式的完整说明,请参见 MySQL 源代码分发中的文件 strings/decimal.c
。该格式在 decimal2bin()
函数中进行了解释(并提供了一个示例)。