【MySQL 数据库】数据类型

大家好,我是无情~今天咱们从头到尾、图文并茂、零基础也能看懂,把 MySQL 最核心的数据类型彻底讲明白。

不管是面试、建表、写 SQL 还是优化,数据类型都是地基。这篇博客我会按照官方文档逻辑,用最通俗的话 + 最实用的案例,让你看完直接能用在项目里。

全文干货,建议收藏慢慢看👇


一、MySQL 数据类型整体分类

MySQL 数据类型主要分 4 大类

  1. 数值类型(整数、小数、bit)
  2. 字符串类型(char、varchar、text、blob)
  3. 日期时间类型(date、datetime、timestamp)
  4. 枚举 / 集合类型(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
相关推荐
运维行者_1 小时前
Applications Manager中的Redis监控
大数据·服务器·数据库·人工智能·网络协议
悦数图数据库3 小时前
图数据库选型指南 2026:从架构、性能、AI 适配三个维度看 悦数科技
数据库·人工智能·架构
handler015 小时前
【MySQL】常用命令总结(库与表增删查改)
运维·数据库·mysql·命令·总结
week@eight5 小时前
Linux - Doris
linux·运维·数据库·mysql
cdbqss16 小时前
VB2026 菜单生成基类 BqGetMenuStrip
数据库·经验分享·学习·oracle·vb
洛水水6 小时前
Redis 分布式锁详解:实现与缺陷
数据库·redis·分布式
韶博雅6 小时前
oracle中表和列转大写
数据库·oracle
暴躁小师兄数据学院7 小时前
【AI大数据工程师特训笔记】第04讲:PostgreSQL 数据库内置函数详解
大数据·数据库·笔记·ai·语言模型
苏渡苇7 小时前
Spring Cloud Alibaba:将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
数据库·spring boot·mysql·spring cloud·nacos·sentinel·持久化