12.22.2 DECIMAL 数据类型 Feature
本节讨论DECIMAL数据类型(及其同义词)的 Feature,特别是以下主题:
-
最大位数
-
Storage format
-
Storage requirements
-
非标准 MySQL 扩展到DECIMAL列的上限
DECIMAL列的声明语法为DECIMAL(M,D)
。自变量的值范围如下:
-
M
*是最大位数(精度)。范围是 1 到 65.
-
D
是小数点右边的位数(小数位数)。它的范围是 0 到 30,并且不得大于M
*。
如果省略* D
,则默认值为 0.如果省略 M
*,则默认值为 10.
M
*的最大值 65table 示对DECIMAL值的计算最多可精确到 65 位数字。此 65 位精度的限制也适用于精确值数字 Literals,因此此类 Literals 的最大范围与以前有所不同。 (DECIMALLiterals 的文本可以有多长;也见第 12.22.3 节“table 达式处理”。)
DECIMAL列的值使用二进制格式存储,该格式将 9 个十进制数字打包为 4 个字节。每个值的整数和小数部分的存储要求分别确定。九位数字的每个倍数需要 4 个字节,剩余的任何剩余数字都需要 4 字节的一部分。下 table 列出了剩余数字所需的存储量。
Leftover Digits | 字节数 |
---|---|
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
。对于负数,不存储 Literals-
字符。
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()
函数中进行了解释(带有示例)。