什么是数据类型
在 MySQL 里面:
数据类型决定了这一列能存什么数据。
比如:
- 年龄 → 整数
- 姓名 → 字符串
- 生日 → 日期
- 工资 → 小数
所以创建表时:
sql
CREATE TABLE student(
name VARCHAR(20),
age INT
);
这里:
VARCHAR(20)表示字符串INT表示整数
一、数值类型
数值类型就是:
存数字。
MySQL 中最常用的是:
| 类型 | 作用 |
|---|---|
| TINYINT | 很小的整数 |
| INT | 普通整数 |
| BIGINT | 大整数 |
| FLOAT | 单精度小数 |
| DOUBLE | 双精度小数 |
| DECIMAL | 精确小数 |
二、整数类型
1. TINYINT
占 1 个字节。
范围很小。
sql
age TINYINT
适合:
- 年龄
- 性别
- 状态位
因为范围够用,而且省空间。
2. INT
最常用的整数类型。
占 4 个字节。
sql
id INT
score INT
开发里:
大部分整数都直接用 INT。
3. BIGINT
超大整数。
占 8 个字节。
sql
qq BIGINT
phone BIGINT
适合:
- QQ号
- 雪花算法ID
- 大数据编号
现在很多项目主键都开始用 BIGINT。
三、小数类型
1. FLOAT
单精度浮点数。
sql
price FLOAT
优点:
- 节省空间
缺点:
- 不精确
所以:
金额一般不用 FLOAT。
因为可能出现:
txt
0.1 + 0.2 ≠ 0.3
2. DOUBLE
双精度浮点数。
比 FLOAT 更精确。
sql
height DOUBLE
但依然存在精度问题。
3. DECIMAL(重点)
精确小数。
开发里:
金额必须用 DECIMAL。
语法:
sql
DECIMAL(总位数, 小数位数)
例如:
sql
salary DECIMAL(10,2)
表示:
txt
总共 10 位
其中 2 位小数
能存:
txt
12345678.99
不能存:
txt
123456789.99
因为超位数了。
四、字符串类型
最常用。
| 类型 | 作用 |
|---|---|
| CHAR | 定长字符串 |
| VARCHAR | 变长字符串 |
| TEXT | 长文本 |
五、CHAR 和 VARCHAR
这是面试高频。
1. CHAR
定长字符串。
sql
name CHAR(10)
无论存:
txt
a
还是:
txt
abcdef
都会占满 10 个字符空间。
特点:
- 查询速度快
- 浪费空间
适合:
- 性别
- 身份证固定长度
- 手机号固定长度
2. VARCHAR(重点)
变长字符串。
sql
name VARCHAR(20)
如果存:
txt
abc
只占 3 个字符长度。
特点:
- 节省空间
- 开发最常用
现在开发里:
基本默认 VARCHAR。
3. CHAR 和 VARCHAR 区别
| 类型 | CHAR | VARCHAR |
|---|---|---|
| 长度 | 固定 | 可变 |
| 空间 | 浪费 | 节省 |
| 速度 | 快 | 稍慢 |
| 场景 | 固定长度 | 普通字符串 |
六、TEXT 类型
存大文本。
sql
content TEXT
适合:
- 博客内容
- 文章
- 评论
- 富文本
因为 VARCHAR 长度有限。
TEXT 可以存很多字符。
七、日期时间类型
| 类型 | 作用 |
|---|---|
| DATE | 日期 |
| TIME | 时间 |
| DATETIME | 日期时间 |
| TIMESTAMP | 时间戳 |
八、DATE
只存日期。
格式:
txt
YYYY-MM-DD
例如:
sql
birthday DATE
存:
txt
2026-05-08
九、TIME
只存时间。
格式:
txt
HH:MM:SS
例如:
sql
start_time TIME
存:
txt
12:30:45
十、DATETIME(重点)
存日期 + 时间。
格式:
txt
YYYY-MM-DD HH:MM:SS
例如:
sql
create_time DATETIME
存:
txt
2026-05-08 12:30:45
开发里非常常见。
十一、TIMESTAMP
也是日期时间。
但是:
它和时区有关。
并且:
- 占用空间更小
- 自动更新时间
很多项目会这样:
sql
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
表示:
插入数据时自动记录当前时间。
十二、常见字段设计
用户表
sql
CREATE TABLE user(
id BIGINT,
username VARCHAR(30),
password VARCHAR(100),
age TINYINT,
salary DECIMAL(10,2),
create_time DATETIME
);
这里:
| 字段 | 类型原因 |
|---|---|
| id | BIGINT 主键 |
| username | VARCHAR 字符串 |
| password | VARCHAR |
| age | TINYINT 足够 |
| salary | DECIMAL 防止精度问题 |
| create_time | DATETIME |
十三、开发中最常用的数据类型
真正开发里高频就这些:
| 类型 | 用途 |
|---|---|
| INT | 普通整数 |
| BIGINT | 主键ID |
| VARCHAR | 字符串 |
| DECIMAL | 金额 |
| DATETIME | 时间 |
| TEXT | 大文本 |
把这几个掌握:
基本已经够用了。
十四、面试高频问题
1. 金额为什么不用 FLOAT?
因为 FLOAT 存在精度丢失。
金额必须精确。
所以:
sql
DECIMAL
才是标准方案。
2. VARCHAR(20) 的 20 是什么?
表示:
最多存 20 个字符。
不是字节。
3. CHAR 和 VARCHAR 怎么选?
固定长度:
txt
CHAR
普通字符串:
txt
VARCHAR
开发里基本默认:
txt
VARCHAR
十五、核心总结
MySQL 数据类型主要分三类:
| 类型 | 作用 |
|---|---|
| 数值类型 | 存数字 |
| 字符串类型 | 存文本 |
| 日期类型 | 存时间 |
开发里最重要的:
sql
INT
BIGINT
VARCHAR
DECIMAL
DATETIME
TEXT