前言
上一篇我们学习了数据库、表、字段、主键、外键这些基础概念。
这一篇继续学习 MySQL 中非常重要的内容:数据类型。
在创建表时,每个字段都必须指定数据类型。
比如:
sql
create table emp (
id int unsigned primary key auto_increment,
username varchar(20),
name varchar(10),
gender tinyint,
phone varchar(11),
entry_date date,
create_time datetime
);
这里的:
text
int
varchar
tinyint
date
datetime
都是 MySQL 中的数据类型。
数据类型选得是否合适,会影响数据存储、查询、计算和后期维护。
这一篇我们就来系统梳理一下 MySQL 中常见的数据类型。
一、为什么字段必须指定数据类型?
数据库不是随便保存字符串的地方。
每个字段指定数据类型,是为了告诉数据库:
text
这个字段保存什么样的数据
这个字段最多能保存多大范围的数据
这个字段能不能参与计算
这个字段应该怎么比较和排序
比如年龄字段适合用数字类型:
sql
age tinyint unsigned
手机号虽然看起来是数字,但是不适合用数字类型,更适合用字符串:
sql
phone varchar(11)
原因很简单:
- 手机号不需要加减乘除
- 手机号可能以 0 开头
- 手机号本质上是一个标识,不是数值
- 字符串保存更安全
所以选择数据类型时,不能只看它长得像什么,还要看它在业务中表示什么。
二、MySQL 常见数据类型分类
MySQL 中常见数据类型可以分成几类:
| 类型分类 | 常见类型 | 适合保存 |
|---|---|---|
| 整数类型 | tinyint、int、bigint |
年龄、状态、id、数量 |
| 小数类型 | decimal、double |
金额、评分、比例 |
| 字符串类型 | char、varchar、text |
姓名、用户名、手机号、描述 |
| 日期时间类型 | date、time、datetime、timestamp |
日期、时间、创建时间、更新时间 |
| 枚举类型 | enum |
固定范围的字符串值 |
实际 Java 后端项目中,用得最多的是:
text
int
bigint
tinyint
varchar
text
date
datetime
decimal
下面我们逐个来看。
三、整数类型
整数类型用来保存没有小数的数据。
常见整数类型如下:
| 类型 | 占用空间 | 有符号范围大致说明 |
|---|---|---|
tinyint |
1 字节 | 很小的整数 |
smallint |
2 字节 | 小整数 |
int |
4 字节 | 普通整数 |
bigint |
8 字节 | 很大的整数 |
在项目中最常用的是:
text
tinyint
int
bigint
1. tinyint
tinyint 适合保存范围比较小的数字,比如性别、状态、开关标记。
sql
gender tinyint unsigned comment '性别:1男,2女'
status tinyint unsigned comment '状态:1启用,0禁用'
这里使用了:
sql
unsigned
表示无符号,也就是不能保存负数。
比如性别、状态这种字段,本来就不会是负数,所以可以加 unsigned。
2. int
int 是最常见的整数类型,适合保存普通 id、数量等。
sql
id int unsigned primary key auto_increment comment 'ID'
dept_id int unsigned comment '部门ID'
在很多学习项目中,主键 id 会使用 int unsigned。
3. bigint
bigint 适合保存很大的整数。
比如:
sql
id bigint unsigned primary key comment '雪花算法ID'
order_no bigint comment '订单编号'
如果项目使用分布式 id,比如雪花算法生成的 id,通常会使用 bigint。
四、整数类型和 Java 类型怎么对应?
常见对应关系可以这样记:
| MySQL 类型 | Java 类型 |
|---|---|
tinyint |
Integer 或 Byte |
int |
Integer |
bigint |
Long |
项目中常见写法:
java
private Integer id;
private Integer gender;
private Long orderId;
如果数据库字段是 bigint,Java 中一般不要用 Integer,而要用 Long。
否则数据过大时可能会溢出。
五、小数类型
小数类型常见有:
text
float
double
decimal
在项目开发中,如果涉及金额,优先使用:
sql
decimal
不要随便使用 float 或 double 保存金额。
1. decimal
decimal 是精确小数,适合保存金额。
比如商品价格:
sql
price decimal(10, 2) comment '商品价格'
这里:
sql
decimal(10, 2)
表示总共最多 10 位数字,其中小数点后保留 2 位。
比如可以保存:
text
99.99
1000.50
88888888.88
2. double
double 是浮点数,适合保存一些对精度要求没有那么严格的数据。
比如评分、比例:
sql
score double comment '评分'
但是金额不建议使用 double,因为浮点数可能存在精度问题。
3. Java 中金额用什么类型?
如果数据库使用:
sql
price decimal(10, 2)
Java 中建议使用:
java
private BigDecimal price;
不要用:
java
private Double price;
金额场景要尽量使用 BigDecimal,这样更准确。
六、字符串类型
字符串类型用来保存文本内容。
常见类型有:
| 类型 | 特点 | 常见场景 |
|---|---|---|
char |
定长字符串 | 固定长度编码 |
varchar |
变长字符串 | 用户名、姓名、手机号 |
text |
长文本 | 文章内容、备注、详情 |
1. char
char 是定长字符串。
比如:
sql
gender char(1)
如果定义为 char(10),即使只保存 3 个字符,也可能按固定长度处理。
所以 char 更适合长度固定的数据。
2. varchar
varchar 是变长字符串,也是项目中最常用的字符串类型。
比如:
sql
username varchar(20) comment '用户名'
name varchar(10) comment '姓名'
phone varchar(11) comment '手机号'
varchar(20) 表示最多保存 20 个字符。
注意这里是字符,不是一定等于 20 个字节。
3. text
text 适合保存较长文本。
比如文章内容、商品详情、备注说明:
sql
content text comment '文章内容'
description text comment '详情描述'
如果只是姓名、手机号、用户名,不要用 text,用 varchar 更合适。
七、手机号为什么用 varchar?
手机号看起来是数字,比如:
text
13800000000
但是它不适合用 bigint,更适合用:
sql
phone varchar(11)
原因有几个:
- 手机号不参与数学计算
- 手机号本质上是一个字符串标识
- 有些号码或编码可能以 0 开头
- 用字符串更方便做格式校验
- 国际手机号可能包含
+86这类前缀
所以:
能不能用数字类型,不是看它长得像不像数字,而是看它需不需要参与数值计算。
八、日期时间类型
项目中常见日期时间类型有:
| 类型 | 保存内容 |
|---|---|
date |
日期,格式类似 2026-06-14 |
time |
时间,格式类似 12:30:00 |
datetime |
日期 + 时间 |
timestamp |
时间戳 |
1. date
date 只保存日期,不保存具体几点几分几秒。
比如入职日期、生日:
sql
entry_date date comment '入职日期'
birthday date comment '生日'
Java 中可以使用:
java
private LocalDate entryDate;
2. datetime
datetime 保存日期和时间。
比如创建时间、更新时间:
sql
create_time datetime comment '创建时间'
update_time datetime comment '修改时间'
Java 中可以使用:
java
private LocalDateTime createTime;
private LocalDateTime updateTime;
这也是 Spring Boot 项目中很常见的写法。
3. timestamp
timestamp 也可以保存日期时间,但它和时区、范围等细节有关。
初学阶段,如果只是普通业务系统中的创建时间、更新时间,使用 datetime 更直观。
九、日期时间类型和 Java 类型对应
可以这样记:
| MySQL 类型 | Java 类型 |
|---|---|
date |
LocalDate |
time |
LocalTime |
datetime |
LocalDateTime |
timestamp |
LocalDateTime 或 Timestamp |
在现代 Java 项目中,更推荐使用:
java
LocalDate
LocalDateTime
比如:
java
public class Emp {
private LocalDate entryDate;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
十、常见字段类型设计示例
下面给出一个员工表的字段设计:
sql
create table emp (
id int unsigned primary key auto_increment comment 'ID',
username varchar(20) not null unique comment '用户名',
password varchar(100) comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned comment '性别:1男,2女',
phone varchar(11) comment '手机号',
salary decimal(10, 2) comment '工资',
entry_date date comment '入职日期',
create_time datetime comment '创建时间',
update_time datetime comment '修改时间'
) comment '员工表';
这个表中:
| 字段 | 类型 | 说明 |
|---|---|---|
id |
int unsigned |
主键 |
username |
varchar(20) |
用户名 |
password |
varchar(100) |
密码 |
name |
varchar(10) |
姓名 |
gender |
tinyint unsigned |
性别 |
phone |
varchar(11) |
手机号 |
salary |
decimal(10,2) |
工资 |
entry_date |
date |
入职日期 |
create_time |
datetime |
创建时间 |
update_time |
datetime |
修改时间 |
这张表基本覆盖了常见的数据类型。
十一、建表时常见约束
除了数据类型,建表时还经常会看到一些约束。
1. not null
表示字段不能为空。
sql
name varchar(10) not null
说明姓名必须填写。
2. unique
表示字段不能重复。
sql
username varchar(20) unique
说明用户名不能重复。
3. default
表示默认值。
sql
status tinyint unsigned default 1
说明如果新增数据时没有传状态,默认状态就是 1。
4. comment
表示字段注释。
sql
name varchar(10) comment '姓名'
注释不会影响数据存储,但是可以让表结构更清楚。
实际开发中建议给表和字段都写上注释。
十二、数据类型选择建议
在项目中选择数据类型时,可以参考下面的习惯:
| 业务字段 | 推荐类型 |
|---|---|
| 主键 id | int unsigned 或 bigint unsigned |
| 姓名 | varchar(10) 或 varchar(20) |
| 用户名 | varchar(20) |
| 密码 | varchar(100) |
| 手机号 | varchar(11) |
| 性别 | tinyint unsigned |
| 状态 | tinyint unsigned |
| 金额 | decimal(10,2) |
| 日期 | date |
| 创建时间 | datetime |
| 文章内容 | text |
当然,具体长度要根据业务调整。
比如用户名最长可能是 30 位,那就可以写:
sql
username varchar(30)
十三、常见问题总结
1. int(11) 是不是表示最多 11 位数字?
不是。
在 MySQL 中,int 本身占 4 个字节,int(11) 中的 11 不是数字范围。
初学时可以先不要纠结这个写法,直接使用:
sql
int unsigned
即可。
2. varchar 长度是不是越大越好?
不是。
虽然 varchar 是变长字符串,但长度也不建议乱写。
比如姓名字段写成:
sql
name varchar(255)
就不太合适。
字段长度应该根据业务合理设置。
3. 金额能不能用 double?
不推荐。
金额建议使用:
sql
decimal(10,2)
Java 中使用:
java
BigDecimal
这样更适合处理精确计算。
4. 创建时间用 date 还是 datetime?
如果只需要日期,用 date。
如果需要具体到时分秒,用 datetime。
比如入职日期用 date,创建时间用 datetime。
5. 密码字段为什么 varchar(100)?
因为真实项目中密码一般不会明文保存,而是保存加密后的字符串。
加密后的字符串通常比原始密码更长,所以密码字段长度要预留大一些。
十四、总结
这一篇主要学习了 MySQL 中常见的数据类型。
整数类型中,tinyint 常用于性别、状态,int 常用于普通 id,bigint 常用于大整数或分布式 id。
字符串类型中,varchar 最常用,适合用户名、姓名、手机号等字段;text 适合文章内容、详情描述这类长文本。
日期时间类型中,date 只保存日期,datetime 保存日期和时间。Java 中通常对应 LocalDate 和 LocalDateTime。
小数类型中,金额建议使用 decimal,Java 中对应 BigDecimal,不要随便用 double 保存金额。
数据类型看起来只是建表时的一小部分,但它会直接影响后面的实体类设计、SQL 查询、MyBatis 映射和业务计算。把这些基础打牢,后面写项目时会顺很多。
下一篇我们继续学习 SQL 的增删改查基础语法,也就是 insert、delete、update、select 的基本使用。