MySQL 8 数字类型终极指南:从 TINYINT 到 DECIMAL,精通数据存储之道!

在构建高效、可靠的数据库时,选择正确的数据类型是基石。一个微小的类型选择失误,可能导致数据溢出、精度丢失,甚至拖慢整个应用。MySQL 8 提供了丰富多样的数字类型,以满足从简单的计数器到高精度的金融计算等各种需求。

让我们一起,由浅入深,彻底征服它们。

图片[1]-**MySQL 8 数字类型终极指南:从 `TINYINT` 到 `DECIMAL`,精通数据存储之道!**

第一部分:整数家族 (Integer Types) – 精确的整数世界

整数类型用于存储没有小数部分的数字。它们是数据库中最常用的类型之一,MySQL 根据存储空间大小提供了多种选择。

1. TINYINT – 小巧玲珑

  • 存储空间: 1 字节 (8 位)
  • 范围:
    • 有符号 (Signed): -128 到 127
    • 无符号 (Unsigned): 0 到 255
  • 核心用途: 非常适合存储状态值或标志位。例如,is_active (0或1), gender (1:男, 2:女, 3:其他), status (1:待处理, 2:处理中, 3:已完成)。
  • 关联类型 BOOL, BOOLEAN: 在 MySQL 中,BOOLBOOLEANTINYINT(1) 的同义词。创建表时使用 BOOLEAN,MySQL 会自动将其转换为 TINYINT(1)。它并非一个真正的布尔类型,0 被视为 FALSE,非零值被视为 TRUE

2. SMALLINT – 恰到好处

  • 存储空间: 2 字节 (16 位)
  • 范围:
    • 有符号: -32,768 到 32,767
    • 无符号: 0 到 65,535
  • 核心用途:TINYINT 不够用,而 INT 又太大时,SMALLINT 是完美选择。例如,存储文章的点赞数、评论数,或者用户的年龄。

3. MEDIUMINT – 中流砥柱

  • 存储空间: 3 字节 (24 位)
  • 范围:
    • 有符号: -8,388,608 到 8,388,607
    • 无符号: 0 到 16,777,215
  • 核心用途: 这是一个“不上不下”但很有用的类型。对于中等规模的应用,比如一个拥有数百万用户的论坛,用它作为用户ID或帖子ID的主键,比 INT 更节省空间。

4. INT (或 INTEGER) – 标准之选

  • 存储空间: 4 字节 (32 位)
  • 范围:
    • 有符号: -2,147,483,648 到 2,147,483,647 (约 ±21亿)
    • 无符号: 0 到 4,294,967,295 (约 42亿)
  • 核心用途: 这是最常见的整数类型,通常作为表的主键 id。对于绝大多数应用,INT 的无符号范围(42亿)都已足够。

5. BIGINT – 海量之王

  • 存储空间: 8 字节 (64 位)
  • 范围:
    • 有符号: 约 -9.22 x 10¹⁸ 到 9.22 x 10¹⁸
    • 无符号: 0 到 约 1.84 x 10¹⁹
  • 核心用途: 当数据量大到 INT 无法容纳时,就必须使用 BIGINT。例如,大型社交网络的用户ID、金融交易流水号、分布式系统中需要全局唯一且趋势递增的ID(如雪花算法ID)。

整数选择法则: 始终选择能满足你业务预期的最小整数类型。这不仅能节省磁盘空间,还能减少内存占用和提高缓存效率。


第二部分:浮点数家族 (Floating-Point Types) – 近似的科学

浮点数用于存储近似值,它们无法精确表示所有小数。这使得它们在需要极大数值范围的科学计算中很有用,但在要求绝对精确的场景(如金融)中则很危险。

1. FLOAT – 单精度浮点数

  • 存储空间: 4 字节
  • 精度: 大约 7 位十进制有效数字。
  • 核心用途: 存储非关键性的、范围很大的小数值,如地理坐标的经纬度(如果精度要求不高)、科学实验的测量数据。
  • 注意: FLOAT 存在精度问题。例如,FLOAT 存储 999.99 可能实际变为 999.990023。

2. DOUBLE (或 DOUBLE PRECISION, REAL) – 双精度浮点数

  • 存储空间: 8 字节
  • 精度: 大约 15 位十进制有效数字。
  • 核心用途: 需要比 FLOAT 更高精度的科学计算或统计分析。
  • 关于 REAL: 在 MySQL 中,REAL 默认是 DOUBLE 的同义词。可以通过设置 SQL 模式 REAL_AS_FLOAT 使其成为 FLOAT 的同义词。

浮点数陷阱: 绝对不要用 FLOATDOUBLE 存储货币!因为它们是近似值,进行计算时会产生微小的误差,累积起来会导致灾难性后果。例如 (0.1 + 0.2) = 0.30000000000000004


第三部分:定点数与位值 – 精确的商业与底层

1. DECIMAL (或 NUMERIC) – 绝对精确的商业计算

  • 存储空间: 变长。由定义的精度 (M) 和标度 (D) 决定。
  • 语法:DECIMAL(M, D)
    • M: 总位数(整数部分 + 小数部分),最大为 65。
    • D: 小数位数,最大为 30。
  • 核心用途: 金融领域的不二之选。用于存储任何要求绝对精确的数值,如商品价格、账户余额、交易金额、利率。DECIMAL 以字符串形式存储,因此不会有任何精度损失。
  • NUMERIC 的关系: NUMERICDECIMAL 的同义词,两者可以互换使用。

示例: DECIMAL(10, 2) 可以存储从 -99,999,999.99 到 99,999,999.99 的值。

2. BIT(M) – 底层的位操作

  • 存储空间: 大约 (M+7)/8 字节。
  • 语法: BIT(M),M 表示位的数量,从 1 到 64。
  • 核心用途: 存储一组二进制位。它非常节省空间,适合存储一组开关状态。例如,BIT(8) 可以用一个字节存储 8 个不同的开关(权限A、权限B、权限C…)。
  • BOOL 的区别: BOOL (TINYINT(1)) 只能表示一个真/假状态,而 BIT(M) 可以表示 M 个。

总结与最佳实践

类型存储空间优点缺点核心场景
TINYINT1 字节极省空间范围小状态、标志位、性别
SMALLINT2 字节空间经济范围有限点赞数、评论数、年龄
MEDIUMINT3 字节空间效率高不如INT通用中型应用ID
INT4 字节通用、性能好对小数据浪费空间默认主键、大多数整数需求
BIGINT8 字节范围极大占用空间大分布式ID、海量数据ID
FLOAT4 字节范围大不精确非关键科学数据、图形数据
DOUBLE8 字节范围和精度都高不精确高精度科学计算
DECIMAL变长绝对精确计算速度稍慢、空间占用大货币、金融、所有需精确计算的场景
BITM/8 字节极度节省空间操作不直观存储多个二进制状态、权限集
BOOL1 字节语义清晰实际是TINYINT(1)单一的真/假状态

最终建议:

  1. 整数优先: 如果不需要小数,总是使用整数类型,并选择最小的那个。
  2. 金钱必用 DECIMAL 任何涉及金钱或要求精确计算的场景,毫不犹豫地使用 DECIMAL
  3. 慎用浮点数: 只有在你清楚地知道你在处理近似值,并且能接受其误差时,才使用 FLOATDOUBLE
  4. UNSIGNED 是个好习惯: 如果你的列(如主键ID、年龄、数量)永远不会是负数,请使用 UNSIGNED 关键字,这能让存储范围翻倍。

掌握这些数字类型,你就能像一位经验丰富的工匠,为你的数据选择最合适的“容器”,从而构建出既坚固又高效的数据库大厦。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享