大家好,我是无情~今天咱们从头到尾、图文并茂、零基础也能看懂,把 MySQL 最核心的数据类型彻底讲明白。
不管是面试、建表、写 SQL 还是优化,数据类型都是地基。这篇博客我会按照官方文档逻辑,用最通俗的话 + 最实用的案例,让你看完直接能用在项目里。
全文干货,建议收藏慢慢看👇
一、MySQL 数据类型整体分类
MySQL 数据类型主要分 4 大类:
- 数值类型(整数、小数、bit)
- 字符串类型(char、varchar、text、blob)
- 日期时间类型(date、datetime、timestamp)
- 枚举 / 集合类型(enum、set)
下面我们一个一个拆开讲。
二、数值类型(最常用)
数值类型分为:
- 整数类型:TINYINT、SMALLINT、INT、BIGINT
- 小数类型:FLOAT、DOUBLE、DECIMAL
- 位类型:BIT
2.1 整数类型(重点)
MySQL 整数默认有符号 ,可以加 UNSIGNED 变成无符号(只能存正数)。
表格
| 类型 | 字节 | 有符号范围 | 无符号范围 | 适用场景 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 状态、性别、年龄 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 小数量 |
| INT | 4 | -21 亿~21 亿 | 0 ~ 42 亿 | 常规 ID、数量 |
| BIGINT | 8 | 超大范围 | 超大范围 | 订单 ID、用户 ID |
🔥 实战重点 1:UNSIGNED 无符号
sql
-- 无符号 tinyint:0~255
create table test(
num TINYINT UNSIGNED
);
insert into test values(-1); -- 报错!不能存负数
insert into test values(255); -- 正常
🔥 实战重点 2:越界会直接报错
sql
create table t(num TINYINT);
insert into t values(128); -- 报错:超出范围
✅ 建议
- 年龄、状态 → TINYINT
- 普通 ID → INT
- 订单号、大数据 → BIGINT
- 尽量少用 UNSIGNED,存不下直接升 BIGINT 更安全。
2.2 BIT 类型(存 0/1 最省空间)
BIT (M):M 表示位数,1~64,默认 1。
sql
create table t(
gender BIT(1) -- 只能存 0 或 1
);
insert into t values(0); -- 正常
insert into t values(1); -- 正常
insert into t values(2); -- 报错!
注意:BIT 查询时会按 ASCII 显示,不是数字。适合:性别、开关、布尔状态。
2.3 小数类型(FLOAT vs DECIMAL 必懂)
① FLOAT(单精度,4 字节)
- 精度有限,大约 7 位有效数字
- 会四舍五入
- 不适合钱、金额
sql
FLOAT(4,2) → 总长度4,小数2位 → -99.99 ~ 99.99
② DECIMAL(高精度定点数)
- 精准无误差
- 适合:钱、工资、金额、财务数据
- DECIMAL (M,D):M 总长度,D 小数位
sql
create table t(
money DECIMAL(10,2) -- 最多存 99999999.99
);
✅ 结论
- 普通小数 → FLOAT
- 钱、金额、高精度 → DECIMAL
三、字符串类型(面试高频)
最核心:CHAR 和 VARCHAR 的区别
3.1 CHAR(固定长度)
- CHAR (L):L 是字符数,最大 255
- 不管存多少,都占满 L 长度
- 速度快,浪费空间
例子:
sql
name CHAR(4)
存 'A' → 仍然占 4 个字符空间
适用:身份证、手机号、MD5、固定长度字符串
3.2 VARCHAR(可变长度)
- VARCHAR (L):按实际存储长度占用
- 最大 65535 字节(受编码影响)
- 节省空间,效率略低
UTF8 下:1 字符 = 3 字节VARCHAR 最大字符数 ≈ 21844
适用:姓名、地址、标题、内容
3.3 CHAR vs VARCHAR 对比(必背)
表格
| 类型 | 长度 | 空间 | 速度 | 适用 |
|---|---|---|---|---|
| CHAR | 固定 | 浪费 | 快 | 固定长度 |
| VARCHAR | 可变 | 节省 | 一般 | 不固定长度 |
一句话:长度固定用 CHAR,不固定用 VARCHAR。
3.4 TEXT / BLOB
- TEXT:大文本,不支持默认值
- BLOB:二进制(图片、文件)一般不用,大文本建议存文件路径。
四、日期时间类型(超级常用)
三种最常用:
表格
| 类型 | 格式 | 字节 | 特点 |
|---|---|---|---|
| DATE | yyyy-mm-dd | 3 | 只存日期 |
| DATETIME | yyyy-mm-dd hh:mm:ss | 8 | 手动存入 |
| TIMESTAMP | 同上 | 4 | 自动更新当前时间 |
🔥 TIMESTAMP 神器
sql
create table t(
create_time TIMESTAMP
);
insert into t values(null);
-- 自动填入当前时间!
-- 更新行时,也会自动更新时间
✅ 建议:
- 只存日期 → DATE
- 常规时间 → DATETIME
- 创建 / 更新时间 → TIMESTAMP
五、ENUM 和 SET(单选 / 多选)
5.1 ENUM(单选)
只能选一个:
sql
gender ENUM('男','女')
底层存数字 1、2,效率高。
5.2 SET(多选)
可以选多个:
sql
hobby SET('登山','游泳','篮球')
插入:'登山,游泳'
查询多选必须用:FIND_IN_SET
sql
select * from t
where FIND_IN_SET('登山', hobby);
六、超全总结(直接背这个)
我给你整理成最实用的建表指南:
- 年龄、状态 → TINYINT
- ID、普通数字 → INT
- 订单 ID、超大值 → BIGINT
- 金额、钱 → DECIMAL
- 性别、开关 → BIT(1)
- 固定长度(身份证)→ CHAR
- 不固定(姓名)→ VARCHAR
- 大文本 → TEXT
- 日期 → DATE
- 时间 → DATETIME
- 创建时间 → TIMESTAMP
- 单选 → ENUM
- 多选 → SET