文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  DECIMAL 数据类型特性

14.24.2 DECIMAL 数据类型特性

本节讨论 DECIMAL 数据类型(及其同义词)的特性,特别关注以下主题:

  • 最大位数

  • 存储格式

  • 存储需求

  • MySQL 对 DECIMAL 列上限范围的非标准扩展

用于 DECIMAL 列的声明语法为 DECIMAL(M,D)。参数的值范围如下:

  • M 是最大位数(精度)。其范围为 1 到 65。

  • D 是小数点右边的位数(标度)。其范围为 0 到 30,且不能大于 M

如果省略 D,则默认值为 0。如果省略 M,则默认值为 10。

M 的最大值为 65,这意味着对 DECIMAL 值的计算精确到 65 位。此 65 位精度的限制也适用于精确值数值字面量,因此此类字面量的最大范围与以前不同。(对 DECIMAL 字面量的文本长度也有限制;请参见 第 14.24.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) 列有十四个整数数字和六个小数数字。整数数字需要 4 个字节用于九个数字,3 个字节用于其余五个数字。六个小数数字需要 3 个字节。

DECIMAL 列不存储前导 + 字符或 - 字符或前导 0 数字。如果你将 +0003.1 插入 DECIMAL(5,1) 列,它将存储为 3.1。对于负数,不会存储字面量 - 字符。

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() 函数中进行了说明(并提供了一个示例)。