MySQL 整型数据类型:选对数字类型,让存储效率翻倍
MySQL 整型数据类型:选对数字类型,让存储效率翻倍
在 MySQL 中,整型(整数类型)是最常用的数据类型之一,从用户 ID 到商品数量,几乎所有涉及数字的场景都离不开它。但你知道吗?选对整型类型不仅能节省存储空间,还能提升查询性能。今天就用最通俗的方式,带你搞懂 MySQL 整型的核心知识。
一、5 种整型类型,一张表讲清区别
MySQL 提供了 5 种基础整型类型,核心区别在于占用字节数和表示范围,直接决定了能存储的数字大小:
类型 | 占用字节 | 有符号范围(默认) | 无符号范围(UNSIGNED) | 典型场景 |
---|---|---|---|---|
TINYINT | 1 字节 | -128 ~ 127 | 0 ~ 255 | 状态值(0/1/2)、性别 |
SMALLINT | 2 字节 | -32768 ~ 32767 | 0 ~ 65535 | 小数量(如评论数) |
MEDIUMINT | 3 字节 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中等规模 ID(如文章 ID) |
INT | 4 字节 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | 普通 ID(用户 ID、订单号) |
BIGINT | 8 字节 | -9e18 ~ 9e18 | 0 ~ 1.8e19 | 大数量(如海量数据 ID) |
二、核心用法:3 个必须掌握的知识点
1. 无符号(UNSIGNED):让正数范围翻倍
默认情况下,整型是 “有符号” 的(可存正负值),但如果确定数值不会为负(如 ID、数量),可加UNSIGNED关键字,让正数范围翻倍:
-- 无符号TINYINT,范围0~255(比有符号的0~127多一倍)
CREATE TABLE products (stock TINYINT UNSIGNED -- 库存不可能为负,用无符号更合理
);
2. 零填充(ZEROFILL):补零显示,不影响存储
加ZEROFILL会在查询时用 0 补全到定义长度(仅影响显示,不改变实际存储值):
CREATE TABLE scores (rank INT(5) ZEROFILL -- 定义长度5,显示时不足补0
);INSERT INTO scores (rank) VALUES (3); -- 存储为3,查询显示"00003"
⚠️ 注意:ZEROFILL会自动隐式添加UNSIGNED,不能存负数。
3. 自增(AUTO_INCREMENT):主键的最佳拍档
整型 +AUTO_INCREMENT是生成唯一 ID 的经典组合,通常搭配PRIMARY KEY使用:
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, -- 自动生成1,2,3...name VARCHAR(50)
);-- 插入时无需指定id,会自动递增
INSERT INTO users (name) VALUES ('张三'), ('李四');
💡 建议:自增主键优先用INT(足够多数场景),超 40 亿数据再用BIGINT。
三、选型原则:记住这 2 条,避免 90% 的坑
- 够用就好,别贪大
比如存储 “性别”(0 = 未知,1 = 男,2 = 女),用TINYINT(1 字节)足够,没必要用INT(4 字节),浪费 3 倍空间。
- 预留扩展,但别过度
比如预估用户量最多 100 万,INT(最大 42 亿)完全够用,没必要一上来就用BIGINT(8 字节)。
四、常见误区:别被 “显示长度” 误导
定义整型时可以加数字,比如INT(10),但这不是存储范围,只是 “显示宽度”:
-
INT(3)和INT(10)存储范围完全一样(都是 4 字节,-21 亿~21 亿)
-
仅当配合ZEROFILL时,才会影响显示(如INT(3) ZEROFILL存 5 会显示 “005”)
所以,别纠结INT(5)还是INT(10),根据范围选INT/BIGINT等类型即可。
总结
MySQL 整型的核心是 “按范围选类型”:小范围用TINYINT/SMALLINT省空间,普通场景用INT,海量数据用BIGINT。记住:合适的类型 = 更少的存储 + 更快的查询,这就是整型优化的精髓。