【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 索引专栏 (二):【核心机制】为什么 SELECT * 是性能杀手?扒开“回表”与“联合索引”的底裤
数据库·mysql
yexuhgu1 小时前
JavaScript中函数防抖Debounce的原理与闭包实现方案
jvm·数据库·python
阿kun要赚马内1 小时前
Python中的ORM——SQLAlchemy
数据库·oracle
m0_613856291 小时前
C#怎么判断进程是否在运行_C#如何管理系统进程【必备】
jvm·数据库·python
NaMM CHIN2 小时前
MySQL无法连接到本地localhost的解决办法2024.11.8
数据库·mysql·adb
Irene19912 小时前
PL/SQL:变量使用 两个连续的外部输入 注意事项
数据库·sql
Jetev2 小时前
golang如何实现审计日志记录_golang审计日志记录实现教程
jvm·数据库·python
yexuhgu2 小时前
Redis如何解决哨兵通知延迟问题_优化客户端连接池动态刷新拓扑的订阅监听机制
jvm·数据库·python
洛水水2 小时前
Redis 协议与异步通信深度解析
数据库·redis·缓存