在 MySQL 中,**数据类型(Data Types)**决定了表字段能够存储什么样的数据以及占用多少存储空间。合理选择数据类型可以 提高性能、节省空间并避免数据错误。
下面是一份 MySQL 数据类型深度解析。
一、MySQL 数据类型分类
MySQL 数据类型主要分为 5 大类:
| 类型 | 说明 |
|---|---|
| 数值类型 | 存储整数和浮点数 |
| 字符串类型 | 存储文本 |
| 日期时间类型 | 存储时间日期 |
| 二进制类型 | 存储二进制数据 |
| JSON 类型 | 存储 JSON 数据 |
二、数值类型(Numeric Types)
1 整数类型(Integer)
| 类型 | 字节 | 范围(有符号) |
|---|---|---|
| TINYINT | 1 | -128 ~ 127 |
| SMALLINT | 2 | -32768 ~ 32767 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 |
| INT | 4 | ±21亿 |
| BIGINT | 8 | ±9.22e18 |
示例:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
age TINYINT,
score SMALLINT
);
常见使用:
| 场景 | 推荐 |
|---|---|
| 年龄 | TINYINT |
| 用户ID | BIGINT |
| 数量 | INT |
2 浮点类型
| 类型 | 说明 |
|---|---|
| FLOAT | 单精度 |
| DOUBLE | 双精度 |
| DECIMAL | 高精度 |
示例:
price DECIMAL(10,2)
含义:
总共10位
小数2位
例:
99999999.99
推荐:
| 场景 | 类型 |
|---|---|
| 金额 | DECIMAL |
| 科学计算 | DOUBLE |
⚠️ 金额 不要使用 FLOAT / DOUBLE。
三、字符串类型(String Types)
1 CHAR
固定长度字符串。
CHAR(10)
特点:
- 长度固定
- 查询速度快
- 空间浪费
适合:
性别
国家代码
状态码
2 VARCHAR
可变长度字符串。
VARCHAR(255)
特点:
- 节省空间
- 查询略慢
适合:
用户名
邮箱
地址
推荐:
| 场景 | 类型 |
|---|---|
| 短文本 | VARCHAR |
| 固定长度 | CHAR |
3 TEXT
存储长文本。
| 类型 | 最大大小 |
|---|---|
| TINYTEXT | 255B |
| TEXT | 64KB |
| MEDIUMTEXT | 16MB |
| LONGTEXT | 4GB |
示例:
content TEXT
常用于:
文章内容
评论
日志
四、日期时间类型
MySQL 提供多种时间类型。
| 类型 | 格式 |
|---|---|
| DATE | YYYY-MM-DD |
| TIME | HH:MM:SS |
| DATETIME | YYYY-MM-DD HH:MM:SS |
| TIMESTAMP | 时间戳 |
| YEAR | 年 |
1 DATETIME
create_time DATETIME
范围:
1000-01-01
9999-12-31
2 TIMESTAMP
特点:
- 自动记录时间
- 占 4 字节
- 时区相关
示例:
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
常用于:
创建时间
更新时间
五、枚举类型(ENUM)
ENUM 是 单选值类型。
gender ENUM('male','female')
优点:
- 节省空间
- 限制合法值
缺点:
- 修改比较麻烦
六、JSON 类型
从 MySQL 5.7 开始支持 JSON。
示例:
info JSON
存储:
{
"name":"Tom",
"age":20
}
查询:
SELECT info->'$.name' FROM users;
适合:
动态字段
配置数据
日志
七、二进制类型
用于存储文件或二进制数据。
| 类型 | 用途 |
|---|---|
| BLOB | 二进制数据 |
| LONGBLOB | 大文件 |
示例:
file_data BLOB
一般用于:
图片
音频
文件
但实际开发通常存 文件路径。
八、数据类型选择最佳实践
1 数值尽量用整数
❌
price FLOAT
✅
price DECIMAL(10,2)
2 VARCHAR 不要过大
❌
VARCHAR(2000)
推荐:
VARCHAR(255)
3 ID 推荐 BIGINT
id BIGINT PRIMARY KEY AUTO_INCREMENT
适合高并发系统。
4 时间字段推荐
create_time DATETIME
update_time DATETIME
九、完整建表示例
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
email VARCHAR(100),
age TINYINT,
balance DECIMAL(10,2),
gender ENUM('male','female'),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
十、开发中最常见数据类型
| 类型 | 用途 |
|---|---|
| BIGINT | ID |
| INT | 数量 |
| VARCHAR | 文本 |
| TEXT | 长文本 |
| DECIMAL | 金额 |
| DATETIME | 时间 |
| JSON | 半结构数据 |
✅ 一句话总结
MySQL 数据类型选择原则:
整数用最小
字符串用 VARCHAR
金额用 DECIMAL
时间用 DATETIME
大文本用 TEXT
如果你愿意,我可以再给你一份 MySQL 数据库表设计规范(阿里巴巴版 + 大厂标准,面试和实际开发都在用)。