本节讨论了 DECIMAL
数据类型(及其同义词)的特征,特别是以下主题:
-
最大数字位数
-
存储格式
-
存储要求
-
MySQL 对
DECIMAL
列的非标准扩展,范围上限
声明 DECIMAL
列的语法为 DECIMAL(
。参数的范围如下:M
,D
)
-
M
是最大数字位数(精度)。其范围是 1 到 65。 -
D
是小数点右侧的数字位数(刻度)。其范围是 0 到 30,且不得大于M
。
如果 D
被省略,默认值为 0。如果 M
被省略,默认值为 10。
M
的最大值 65 意味着 DECIMAL
值的计算精度高达 65 位。此限制也适用于精确值数字文字,因此最大范围与之前不同。(还有一个限制,即 DECIMAL
文字的长度;见 第 14.24.3 节,“表达式处理”。)
DECIMAL
列的值使用二进制格式存储,每 4 字节存储 9 位数字。整数部分和小数部分的存储要求分别确定。每 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 位数字,剩余 5 位数字需要 3 字节。小数数字需要 3 字节。
DECIMAL
列不存储前导 +
字符或 -
字符或前导 0
数字。如果您将 +0003.1
插入到 DECIMAL(5,1)
列中,它将被存储为 3.1
。对于负数,literal -
字符不被存储。
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()
函数中以示例形式进行了解释。