MySQL INT 数据类型详解:最大值、范围、存储大小及弃用变更(MySQL 8+)

1. 引言

MySQL 是一种流行的关系型数据库管理系统,广泛用于许多 Web 应用程序和数据库系统中。在其数据类型中,INT 类型是最常用于处理数值的最常用类型之一。本文详细解释了 MySQL INT 类型。特别是,我们将探讨 INT 类型支持的最大值以及如何高效使用它。通过阅读本文,您将获得在 MySQL 中正确使用 INT 类型的必要知识。

2. INT 类型的基本规格

INT 的最大和最小值

MySQL INT 类型使用 4 字节(32 位)存储,它可以存储的值范围如下:

  • 有符号 (SIGNED)
  • 最小值:-2,147,483,648
  • 最大值:2,147,483,647
  • 无符号 (UNSIGNED)
  • 最小值:0
  • 最大值:4,294,967,295

INT 的存储大小

INT 类型始终使用 4 字节的存储。此大小与存储的值无关而保持不变。因此,如果您不需要处理非常大的数值范围,考虑使用较小的数据类型(例如,TINYINTSMALLINT)会更高效。

INT 的使用场景

INT 类型通常用于以下场景:

  • 自增值(例如,用户 ID、订单号)
  • 用于计算或统计处理的整数数据(例如,库存计数、点击计数)
  • 在固定范围内表示的数据(例如,年龄或考试分数)

在这些使用场景中,考虑所需的数值范围和内存效率很重要。

3. INT(M) 中的 M 是什么意思?

什么是显示宽度 (M)?

在 MySQL 中,INT(M) 中的 M 表示“显示宽度”。它不影响数据库中实际存储的数值;相反,它指定了显示值时的格式。例如,如果定义为 INT(5),数字将以 5 位宽度显示。

然而,显示宽度 M 仅在以下情况下有意义:

  • 当启用 ZEROFILL 选项时
  • 示例:使用 INT(5) ZEROFILL,如果值为 123,它将显示为 00123

关于 ZEROFILL 的重要说明

使用 ZEROFILL 选项时,以下特性适用:

  1. 左侧自动添加前导零。
  2. 自动应用 UNSIGNED 属性。

因此,如果需要存储负值,则不能使用 ZEROFILL

澄清常见误解

许多初学者错误地认为 M 限制了最大可存储值。然而,M 仅影响显示格式,对实际存储范围绝对没有影响。

4. 与其他整数类型的比较

整数数据类型及其范围

MySQL 提供以下整数类型:

Type NameBytesSigned RangeUnsigned Range
TINYINT1 byte-128 to 1270 to 255
SMALLINT2 bytes-32,768 to 32,7670 to 65,535
MEDIUMINT3 bytes-8,388,608 to 8,388,6070 to 16,777,215
INT4 bytes-2,147,483,648 to 2,147,483,6470 to 4,294,967,295
BIGINT8 bytes-9,223,372,036,854,775,808 to 9,223,372,036,854,775,8070 to 18,446,744,073,709,551,615

选择标准

在数据库设计中选择合适数据类型时,使用以下指南:

  • 如果范围较小:使用 TINYINTSMALLINT 以节省内存。
  • 如果需要极大数据范围:使用 BIGINT
  • 如果希望通用使用:INT 通常是最优的。

5. 自 MySQL 8.0.17 以来的变化

显示宽度 (M) 的弃用

从 MySQL 8.0.17 开始,整数类型的“显示宽度 (M)”已被弃用。此更改与 ZEROFILL 选项的弃用一起引入,并在未来的 MySQL 版本中可能被移除。

弃用显示宽度的原因如下:

  1. 导致误解:
  • 许多用户误解 M 影响最大可存储值或位数。
  1. 实际使用有限:
  • 由于 M 仅控制显示格式,现在格式化通常在应用程序端处理,从而减少了其必要性。

ZEROFILL 的弃用

在同一版本中,ZEROFILL 选项也已被弃用。虽然 ZEROFILL 在为数字前置零方面很方便,但由于以下原因不再推荐使用:

  • 广泛的替代方案:
  • 现在可以在应用程序或 UI 层轻松实现零填充。
  • 避免混淆:
  • 在使用 ZEROFILL 时会自动应用 UNSIGNED 属性,这会让初学者感到困惑。

如何适应弃用

针对这些弃用,考虑在数据库设计中采用以下方法:

  1. 在应用层处理格式化: * 在应用程序或展示层执行零填充和格式化。 * 示例:使用 PHP 或 JavaScript 实现零填充。

  2. 采用不依赖显示宽度的设计: * 定义 INT 类型时不指定 M,关注数据准确性而非显示格式。

6. 实用 FAQ 部分

常见问题

问1. 如果我存储的值超过 INT 类型的最大值会怎样?
答:在 MySQL 中,尝试存储超出 INT 类型范围的值会导致错误。您必须选择在支持范围内的值,或切换到范围更大的数据类型(例如 BIGINT)。

问2. INT 与 BIGINT 有何区别?
答:BIGINT 类型使用的存储空间是 INT 的两倍(8 字节),并提供更宽广的数值范围。例如,BIGINT 的有符号范围超过 ±9 千兆(quintillion),适用于处理非常大的数据集。

问3. ZEROFILL 被弃用后,如何实现零填充显示?
答:推荐在应用层处理零填充。例如,在 PHP 中可以使用 str_pad() 函数,在 JavaScript 中可以使用 padStart() 方法实现零填充。

问4. 应该如何在 INT 与其他整数类型之间做选择?
答:应根据数据范围进行选择。小数值(例如年龄或分数)适合使用 TINYINT,中等规模数据(例如用户 ID)适合使用 INT,而非常大的数值(例如金融交易数据)则适合使用 BIGINT

7. 结论

本文对 MySQL INT 数据类型进行了详细说明。关键要点如下:

  • 了解 INT 类型有符号和无符号的最大、最小值之间的差异是正确数据设计的基础。
  • 了解对已弃用的“显示宽度 (M)”和“ZEROFILL”选项的替代方案,并设计能够适应未来 MySQL 更新的数据库,这一点很重要。
  • 根据数据特性选择合适的整数类型,以构建高效且易于维护的数据库。

请以本文为参考,优化对 INT 类型的使用,进一步提升 MySQL 数据库设计的效率。