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() 函数中有详细解释(带示例)。