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字节数
00
1–21
3–42
5–63
7–94

例如,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)列支持-999999的范围。 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()函数中进行了解释(带有示例)。