MySQL 常用数据类型的系统总结

一、数值型(存储数字,含整数、小数、布尔值)

1. 整数类型(INT 系列)

|-----------|-----|---------------------------|-----------------|--------|--------------------------|
| 数据类型 | 字节数 | 取值范围(有符号) | 取值范围(无符号) | 核心特性 | 适用场景 |
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 占用空间最小 | 状态标记(0/1)、年龄(简化)、评分等级 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 中小型整数 | 班级人数、序号、金额(分) |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中大型整数 | 数据量较大的 ID、统计数 |
| INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | 最常用 | 学生 ID、订单号、成绩、年龄 |
| BIGINT | 8 | -9e18 ~ 9e18 | 0 ~ 1.8e19 | 超大整数 | 海量数据 ID(如日志 ID)、时间戳(毫秒级) |

关键说明

  • 加 UNSIGNED 关键字表示无符号(仅存非负数),如 INT UNSIGNED;
  • 整数类型可指定 ZEROFILL(零填充),如 INT(5) ZEROFILL,不足位数补 0(仅无符号有效)。
2. 小数类型(精确 / 近似小数)

|--------------|-----|--------------------------------|-----------|--------------------|
| 数据类型 | 字节数 | 格式说明 | 核心特性 | 适用场景 |
| DECIMAL(M,D) | 可变 | M = 总位数(1~65),D = 小数位数(0~30) | 精确小数(无误差) | 金额、汇率、分数(如 85.5 分) |
| FLOAT(M,D) | 4 | 单精度浮点型,M = 总位数,D = 小数位数 | 近似小数(误差小) | 科学计算、非精确统计(如身高、体重) |
| DOUBLE(M,D) | 8 | 双精度浮点型,精度高于 FLOAT | 近似小数(精度高) | 工程计算、大数据量浮点存储 |

示例

  • 金额字段:DECIMAL(10,2)(支持 0.00 ~ 99999999.99);
  • 身高字段:FLOAT(5,1)(支持 0.0 ~ 999.9)。
3. 布尔类型(BOOL/BOOLEAN)
  • 本质是 TINYINT(1) 的别名,仅存 0(假)或 1(真);
  • 示例:is_active BOOLEAN DEFAULT 1(默认启用状态)。

二、字符串型(存储文本、字符,含固定 / 可变长度)

1. 短字符串类型

|------------|------------|----------------|-----------|------------------------------------------------------|
| 数据类型 | 字节数 | 长度限制 | 核心特性 | 适用场景 |
| CHAR(M) | M(1~255) | 固定长度(M 为字符数) | 存储效率高,查询快 | 用户名(如 CHAR (20))、手机号(CHAR (11))、性别(CHAR (2)) |
| VARCHAR(M) | 可变(1~255) | 可变长度(M 为最大字符数) | 节省空间 | 姓名(VARCHAR (20))、地址(VARCHAR (100))、备注(VARCHAR (255)) |

核心区别

  • CHAR:无论实际存储内容长度,均占用 M 个字符空间(如 CHAR(10) 存 "abc" 仍占 10 字符);
  • VARCHAR:仅占用实际内容长度 + 1~2 字节(记录长度),适合长度不固定的文本。
2. 长文本类型

|------------|--------------------|-------|----------------|
| 数据类型 | 长度限制 | 核心特性 | 适用场景 |
| TINYTEXT | 0 ~ 255 字符 | 短文本 | 简短描述、备注 |
| TEXT | 0 ~ 65535 字符 | 常用长文本 | 文章内容、详细说明 |
| MEDIUMTEXT | 0 ~ 16777215 字符 | 中长文本 | 日志数据、大段描述 |
| LONGTEXT | 0 ~ 4294967295 字符 | 超长文本 | 海量文本(如小说、备份数据) |

注意:文本类型不能设置默认值,查询效率低于 CHAR/VARCHAR,不建议用于排序 / 分组(可通过索引优化)。

3. 特殊字符串类型
  • ENUM:枚举类型,只能从指定列表中选一个值,如 gender ENUM('男','女','未知');

适用场景:固定选项(如性别、学历、订单状态),存储效率高(存数字索引)。

  • SET:集合类型,可从指定列表中选多个值(用逗号分隔),如 hobby SET('读书','运动','游戏');

适用场景:多选项(如兴趣爱好),最多支持 64 个选项。

三、日期时间型(存储时间、日期,精确到不同粒度)

|-----------|-----|--------------------------------------------|---------------------|---------------------|-------------|
| 数据类型 | 字节数 | 取值范围 | 格式示例 | 核心特性 | 适用场景 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 2025-04-10 | 仅存日期 | 生日、注册日期 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | 14:30:00 | 仅存时间 | 上课时间、打卡时间 |
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 2025-04-10 14:30:00 | 日期 + 时间(不受时区影响) | 订单创建时间、考试时间 |
| TIMESTAMP | 4 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 2025-04-10 14:30:00 | 日期 + 时间(受时区影响,自动转换) | 日志时间、更新时间 |
| YEAR | 1 | 1901 ~ 2155 | 2025 | 仅存年份 | 入学年份、毕业年份 |

常用函数

  • 获取当前时间:NOW()(返回 DATETIME)、CURDATE()(返回 DATE)、CURTIME()(返回 TIME);
  • 时间戳转换:UNIX_TIMESTAMP()(DATETIME→时间戳)、FROM_UNIXTIME()(时间戳→DATETIME)。

四、二进制型(存储二进制数据,如文件、图片)

|------------|--------------------|-------|-------------------|
| 数据类型 | 长度限制 | 核心特性 | 适用场景 |
| TINYBLOB | 0 ~ 255 字节 | 短二进制 | 小图标、缩略图 |
| BLOB | 0 ~ 65535 字节 | 常用二进制 | 图片、音频片段 |
| MEDIUMBLOB | 0 ~ 16777215 字节 | 中长二进制 | 视频、大文件 |
| LONGBLOB | 0 ~ 4294967295 字节 | 超长二进制 | 超大文件(不推荐,建议存文件路径) |

注意:二进制类型存储文件会导致数据库体积膨胀,查询效率低,实际开发中更推荐存储文件的服务器路径(如 /upload/2025/04/10/photo.jpg)。

五、空间类型(GIS 相关,存储地理数据)

  • 常用类型:POINT(点,如经纬度)、LINESTRING(线)、POLYGON(面);
  • 适用场景:地图应用(如店铺位置、路线规划),需配合 MySQL 的 GIS 函数使用(如计算距离)。

六、数据类型选择原则

  1. 最小够用原则:优先选择能满足需求的最小类型(如年龄用 TINYINT 而非 INT,手机号用 CHAR (11) 而非 VARCHAR (20));
  1. 精度匹配原则:金额、分数等需精确计算的场景用 DECIMAL,避免 FLOAT/DOUBLE 的精度误差;
  1. 查询效率原则:频繁查询、排序、分组的字段用 CHAR/VARCHAR,避免 TEXT/BLOB;
  1. 时间场景原则:跨时区用 TIMESTAMP,无需时区转换用 DATETIME,仅存日期用 DATE;
  1. 兼容性原则:避免使用 ENUM/SET(修改选项需 ALTER TABLE),可改用关联表存储固定选项。
相关推荐
言乐64 分钟前
Python游戏水平测试辅助系统2
开发语言·windows·python·游戏·django
wabs66622 分钟前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
NiceCloud喜云27 分钟前
腾讯云国际版云数据库选型:MySQL、Redis 怎么按业务架构来判断
数据库·mysql·腾讯云
CIO_Alliance30 分钟前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
ew4521835 分钟前
MySQL JOIN 关联语法、差异、标准用法、经典坑点汇总
数据库·mysql
Rain的Java大神之路1 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Nturmoils1 小时前
给运营导个 CSV,在 ksql 里用 \copy 就够了
数据库
jerryinwuhan1 小时前
《Python数据预处理》第四章
开发语言·python
ciqingloveless1 小时前
Oracle打开数据库加密
数据库·oracle
..Dauntless..2 小时前
手写vector vs std::vector:从功能正确到性能达标
算法