在构建高效、可靠的数据库时,选择正确的数据类型是基石。一个微小的类型选择失误,可能导致数据溢出、精度丢失,甚至拖慢整个应用。MySQL 8 提供了丰富多样的数字类型,以满足从简单的计数器到高精度的金融计算等各种需求。
让我们一起,由浅入深,彻底征服它们。
![图片[1]-**MySQL 8 数字类型终极指南:从 `TINYINT` 到 `DECIMAL`,精通数据存储之道!**](https://share.0f1.top/wwj/site/soft/2025/06/19/20250619113704797.webp)
第一部分:整数家族 (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 中,BOOL
和BOOLEAN
是TINYINT(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
的同义词。
浮点数陷阱: 绝对不要用 FLOAT
或 DOUBLE
存储货币!因为它们是近似值,进行计算时会产生微小的误差,累积起来会导致灾难性后果。例如 (0.1 + 0.2) = 0.30000000000000004
。
第三部分:定点数与位值 – 精确的商业与底层
1. DECIMAL
(或 NUMERIC
) – 绝对精确的商业计算
- 存储空间: 变长。由定义的精度 (M) 和标度 (D) 决定。
- 语法:DECIMAL(M, D)
M
: 总位数(整数部分 + 小数部分),最大为 65。D
: 小数位数,最大为 30。
- 核心用途: 金融领域的不二之选。用于存储任何要求绝对精确的数值,如商品价格、账户余额、交易金额、利率。
DECIMAL
以字符串形式存储,因此不会有任何精度损失。 - 与
NUMERIC
的关系:NUMERIC
是DECIMAL
的同义词,两者可以互换使用。
示例: 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 个。
总结与最佳实践
类型 | 存储空间 | 优点 | 缺点 | 核心场景 |
---|---|---|---|---|
TINYINT | 1 字节 | 极省空间 | 范围小 | 状态、标志位、性别 |
SMALLINT | 2 字节 | 空间经济 | 范围有限 | 点赞数、评论数、年龄 |
MEDIUMINT | 3 字节 | 空间效率高 | 不如INT通用 | 中型应用ID |
INT | 4 字节 | 通用、性能好 | 对小数据浪费空间 | 默认主键、大多数整数需求 |
BIGINT | 8 字节 | 范围极大 | 占用空间大 | 分布式ID、海量数据ID |
FLOAT | 4 字节 | 范围大 | 不精确 | 非关键科学数据、图形数据 |
DOUBLE | 8 字节 | 范围和精度都高 | 不精确 | 高精度科学计算 |
DECIMAL | 变长 | 绝对精确 | 计算速度稍慢、空间占用大 | 货币、金融、所有需精确计算的场景 |
BIT | M/8 字节 | 极度节省空间 | 操作不直观 | 存储多个二进制状态、权限集 |
BOOL | 1 字节 | 语义清晰 | 实际是TINYINT(1) | 单一的真/假状态 |
最终建议:
- 整数优先: 如果不需要小数,总是使用整数类型,并选择最小的那个。
- 金钱必用
DECIMAL
: 任何涉及金钱或要求精确计算的场景,毫不犹豫地使用DECIMAL
。 - 慎用浮点数: 只有在你清楚地知道你在处理近似值,并且能接受其误差时,才使用
FLOAT
或DOUBLE
。 UNSIGNED
是个好习惯: 如果你的列(如主键ID、年龄、数量)永远不会是负数,请使用UNSIGNED
关键字,这能让存储范围翻倍。
掌握这些数字类型,你就能像一位经验丰富的工匠,为你的数据选择最合适的“容器”,从而构建出既坚固又高效的数据库大厦。
© 版权声明
THE END