14.24.2 DECIMAL 数据类型特征
本节讨论DECIMAL
数据类型(及其同义词),特别是以下主题:
-
最大数字个数
-
存储格式
-
存储要求
-
MySQL 对
DECIMAL
列的非标准扩展上限
声明DECIMAL
列的语法是 DECIMAL(
. 参数的取值范围如下:M
,D
)
-
M
是最大数字个数(精度)。它的取值范围是1到65。 -
D
是小数点右侧的数字个数(精度)。它的取值范围是0到30,并且不能大于M
。
如果D
被省略,缺省为0。如果M
被省略,缺省为10。
DECIMAL值的计算精度最高到65位。这也适用于精确值数字字面量的最大范围(见Section 14.24.3, “Expression Handling”)。
DECIMAL值存储在二进制格式中,每9个数字占用4个字节。存储整数和小数部分的要求分别确定。每个值的整数部分和小数部分都需要4个字节。剩余的数字需要的存储量见下表。
Leftover Digits | Number of Bytes |
---|---|
0 | 0 |
1–2 | 1 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
例如,DECIMAL(18,9)
列有9个数字在小数点两侧,因此整数部分和小数部分各需要4个字节。DECIMAL(20,6)
列有14个整数数字和6个小数数字。整数数字需要4个字节的9个数字和3个字节的5个数字。6个小数数字需要3个字节。
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()
函数中有详细解释(带示例)。