Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  DECIMAL Data Type Characteristics

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 位。此限制也适用于精确值数字文字,因此最大范围与之前不同。(还有一个限制,即 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) 列支持的范围是 -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() 函数中以示例形式进行了解释。