【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 小时前
从 MySQL 到在线表格:NocoDB 自托管部署、数据导入与远程访问
数据库·mysql
倔强的石头1062 小时前
高可用与无感扩容——分布式时序数据库选型指南
数据库·分布式·时序数据库
91刘仁德9 小时前
MYSQL 事务原理及使用
android·mysql·adb
wxwx_bscxy32210 小时前
NodeJS 高校学业预警系统10551
mysql·node.js·vue·高校学业预警
袋鼠云数栈10 小时前
实时湖仓如何真正做到“数据够新”?
大数据·数据库·人工智能·数据治理
ACP广源盛1392462567310 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#YLB3116 中端多盘存储扩展在 AI 服务中的机会与应用场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos
ACP广源盛1392462567311 小时前
M6/M5 Pro Mac mini 端侧 AI 新形态@ACP#GSV5800 Serdes 长距离视频传输在 AI 服务中的机会与落地场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos·音视频
倔强的石头_13 小时前
事务边界与批量写入:避免长事务、锁等待和日志压力
数据库
努力努力再努力wz13 小时前
【Redis入门系列】从 KEYS 到 SCAN:渐进式遍历、Cursor 与位反转原理
数据库·redis·缓存
坐吃山猪13 小时前
【多线程】Lock与Condition
大数据·数据库