本节讨论
DECIMAL
数据类型(及其同义词)的特征,特别是关于以下主题:
最大位数
存储格式
存储要求
DECIMAL
对列 上限范围的非标准 MySQL 扩展
列的声明语法
DECIMAL
是
. 参数值的范围如下:
DECIMAL(
M
,D
)
M
是最大位数(精度)。它的范围是 1 到 65。D
是小数点右边的位数(刻度)。它的范围是 0 到 30,并且不能大于M
.
如果D
省略,则默认为 0。如果
M
省略,则默认为 10。
最大值 65M
表示对DECIMAL
值的计算精确到 65 位。这个 65 位精度的限制也适用于精确值数字文字,因此此类文字的最大范围与以前不同。(文字文本的长度也有限制DECIMAL
;请参阅
第 12.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)
列有十四位整数和六位小数。整数数字中的九个数字需要四个字节,其余五个数字需要三个字节。六个小数位需要 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()
。