mysql数据类型

什么是数据类型

在 MySQL 里面:

数据类型决定了这一列能存什么数据。

比如:

  • 年龄 → 整数
  • 姓名 → 字符串
  • 生日 → 日期
  • 工资 → 小数

所以创建表时:

sql 复制代码
CREATE TABLE student(
    name VARCHAR(20),
    age INT
);

这里:

  • VARCHAR(20) 表示字符串
  • INT 表示整数

一、数值类型

数值类型就是:

存数字。

MySQL 中最常用的是:

类型 作用
TINYINT 很小的整数
INT 普通整数
BIGINT 大整数
FLOAT 单精度小数
DOUBLE 双精度小数
DECIMAL 精确小数

二、整数类型

1. TINYINT

占 1 个字节。

范围很小。

sql 复制代码
age TINYINT

适合:

  • 年龄
  • 性别
  • 状态位

因为范围够用,而且省空间。


2. INT

最常用的整数类型。

占 4 个字节。

sql 复制代码
id INT
score INT

开发里:

大部分整数都直接用 INT。


3. BIGINT

超大整数。

占 8 个字节。

sql 复制代码
qq BIGINT
phone BIGINT

适合:

  • QQ号
  • 雪花算法ID
  • 大数据编号

现在很多项目主键都开始用 BIGINT。


三、小数类型

1. FLOAT

单精度浮点数。

sql 复制代码
price FLOAT

优点:

  • 节省空间

缺点:

  • 不精确

所以:

金额一般不用 FLOAT。

因为可能出现:

txt 复制代码
0.1 + 0.2 ≠ 0.3

2. DOUBLE

双精度浮点数。

比 FLOAT 更精确。

sql 复制代码
height DOUBLE

但依然存在精度问题。


3. DECIMAL(重点)

精确小数。

开发里:

金额必须用 DECIMAL。

语法:

sql 复制代码
DECIMAL(总位数, 小数位数)

例如:

sql 复制代码
salary DECIMAL(10,2)

表示:

txt 复制代码
总共 10 位
其中 2 位小数

能存:

txt 复制代码
12345678.99

不能存:

txt 复制代码
123456789.99

因为超位数了。


四、字符串类型

最常用。

类型 作用
CHAR 定长字符串
VARCHAR 变长字符串
TEXT 长文本

五、CHAR 和 VARCHAR

这是面试高频。


1. CHAR

定长字符串。

sql 复制代码
name CHAR(10)

无论存:

txt 复制代码
a

还是:

txt 复制代码
abcdef

都会占满 10 个字符空间。

特点:

  • 查询速度快
  • 浪费空间

适合:

  • 性别
  • 身份证固定长度
  • 手机号固定长度

2. VARCHAR(重点)

变长字符串。

sql 复制代码
name VARCHAR(20)

如果存:

txt 复制代码
abc

只占 3 个字符长度。

特点:

  • 节省空间
  • 开发最常用

现在开发里:

基本默认 VARCHAR。


3. CHAR 和 VARCHAR 区别

类型 CHAR VARCHAR
长度 固定 可变
空间 浪费 节省
速度 稍慢
场景 固定长度 普通字符串

六、TEXT 类型

存大文本。

sql 复制代码
content TEXT

适合:

  • 博客内容
  • 文章
  • 评论
  • 富文本

因为 VARCHAR 长度有限。

TEXT 可以存很多字符。


七、日期时间类型

类型 作用
DATE 日期
TIME 时间
DATETIME 日期时间
TIMESTAMP 时间戳

八、DATE

只存日期。

格式:

txt 复制代码
YYYY-MM-DD

例如:

sql 复制代码
birthday DATE

存:

txt 复制代码
2026-05-08

九、TIME

只存时间。

格式:

txt 复制代码
HH:MM:SS

例如:

sql 复制代码
start_time TIME

存:

txt 复制代码
12:30:45

十、DATETIME(重点)

存日期 + 时间。

格式:

txt 复制代码
YYYY-MM-DD HH:MM:SS

例如:

sql 复制代码
create_time DATETIME

存:

txt 复制代码
2026-05-08 12:30:45

开发里非常常见。


十一、TIMESTAMP

也是日期时间。

但是:

它和时区有关。

并且:

  • 占用空间更小
  • 自动更新时间

很多项目会这样:

sql 复制代码
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP

表示:

插入数据时自动记录当前时间。


十二、常见字段设计

用户表

sql 复制代码
CREATE TABLE user(
    id BIGINT,
    username VARCHAR(30),
    password VARCHAR(100),
    age TINYINT,
    salary DECIMAL(10,2),
    create_time DATETIME
);

这里:

字段 类型原因
id BIGINT 主键
username VARCHAR 字符串
password VARCHAR
age TINYINT 足够
salary DECIMAL 防止精度问题
create_time DATETIME

十三、开发中最常用的数据类型

真正开发里高频就这些:

类型 用途
INT 普通整数
BIGINT 主键ID
VARCHAR 字符串
DECIMAL 金额
DATETIME 时间
TEXT 大文本

把这几个掌握:

基本已经够用了。


十四、面试高频问题

1. 金额为什么不用 FLOAT?

因为 FLOAT 存在精度丢失。

金额必须精确。

所以:

sql 复制代码
DECIMAL

才是标准方案。


2. VARCHAR(20) 的 20 是什么?

表示:

最多存 20 个字符。

不是字节。


3. CHAR 和 VARCHAR 怎么选?

固定长度:

txt 复制代码
CHAR

普通字符串:

txt 复制代码
VARCHAR

开发里基本默认:

txt 复制代码
VARCHAR

十五、核心总结

MySQL 数据类型主要分三类:

类型 作用
数值类型 存数字
字符串类型 存文本
日期类型 存时间

开发里最重要的:

sql 复制代码
INT
BIGINT
VARCHAR
DECIMAL
DATETIME
TEXT
相关推荐
倔强的石头_1 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横1 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二1 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐2 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
云技纵横2 天前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
无响应de神2 天前
三、用户与权限管理
数据库·mysql
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql