MySQL 数据类型

目录

[一、数值类型:别让数据 "越界"](#一、数值类型:别让数据 “越界”)

[1. 整数类型:tinyint/int 的坑](#1. 整数类型:tinyint/int 的坑)

[2. 小数类型:float vs decimal,别再用错了!](#2. 小数类型:float vs decimal,别再用错了!)

[二、字符串类型:char 和 varchar 怎么选?](#二、字符串类型:char 和 varchar 怎么选?)

[三、日期类型:datetime 和 timestamp 的 "自动更新" 坑](#三、日期类型:datetime 和 timestamp 的 “自动更新” 坑)

[四、枚举类型:enum/set 的 "多选查询" 坑](#四、枚举类型:enum/set 的 “多选查询” 坑)

总结:选型口诀


作为后端开发,MySQL 数据类型选不对,轻则浪费存储,重则触发 "离奇" bug。这篇结合实战案例,拆解常用数据类型的用法与坑点~

一、数值类型:别让数据 "越界"

数值类型最容易踩的坑是范围溢出,先看几个核心类型:

1. 整数类型:tinyint/int 的坑

tinyint为例:

  • 默认有符号 ,范围是 -128 ~ 127
  • unsigned后范围变为 0 ~ 255

如果硬插超范围值,直接报错:

sql 复制代码
create table tt1(num tinyint);
insert into tt1 values(128); -- 报错:out of range

建议:尽量不用unsigned,int 存不下就升级为bigint,更稳妥。

2. 小数类型:float vs decimal,别再用错了!

float 是 "近似值",decimal 是 "精确值",看案例:

sql 复制代码
create table tt8(
  id int,
  salary float(10,8),   -- 近似存储
  salary2 decimal(10,8) -- 精确存储
);
insert into tt8 values(100,23.12345612,23.12345612);
select * from tt8;
-- 结果:salary显示23.12345695(丢精度),salary2显示23.12345612(精确)

结论 :存金额、税率等用decimal,存非高精度值(如身高)用float

二、字符串类型:char 和 varchar 怎么选?

这俩都是存字符串,但适用场景天差地别:

特性 char(L) varchar(L)
长度 固定(L 为字符数) 可变(L 为最大字符数)
存储开销 浪费空间,但查询快 省空间,但查询略慢
适用场景 固定长度数据(身份证) 可变长度数据(姓名)

案例:char(2)能存 2 个字符(字母 / 汉字),varchar(6)可存最多 6 个字符:

sql 复制代码
create table tt9(id int, name char(2));
insert into tt9 values(101, '中国'); -- 正常(2个汉字)

create table tt10(id int, name varchar(6));
insert into tt10 values(100, '我爱你,中国'); -- 正常(6个字符)

三、日期类型:datetime 和 timestamp 的 "自动更新" 坑

常用日期类型有 3 个,但timestamp有个隐藏特性:自动更新时间

看案例:

sql 复制代码
create table birthday(t1 date, t2 datetime, t3 timestamp);
insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
select * from birthday;
-- t3自动填充"插入时的当前时间"

update birthday set t1='2000-1-1';
select * from birthday;
-- t3自动更新为"修改时的当前时间"

结论

  • 存 "创建 / 更新时间" 用timestamp(自动维护);
  • 存固定时间(如订单支付时间)用datetime

四、枚举类型:enum/set 的 "多选查询" 坑

如果字段是固定选项(如性别、爱好),可用enum(单选)或set(多选),但set查询要注意:不能直接用=匹配

案例:存 "爱好" 用set,查询 "喜欢登山的人":

cpp 复制代码
create table votes(
  username varchar(30),
  hobby set('登山','游泳','篮球','武术'), -- 多选
  gender enum('男','女')
);
insert into votes values('雷锋','登山,武术','男');

-- 错误写法:查不到"登山+武术"的记录
select * from votes where hobby='登山';

-- 正确写法:用find_in_set函数
select * from votes where find_in_set('登山', hobby);

总结:选型口诀

  1. 整数选int,海量用bigint,别用unsigned
  2. 小数精度选decimal,非精度选float
  3. 定长字符用char,变长用varchar
  4. 自动时间戳用timestamp,固定时间用datetime
  5. 多选查询set字段,记得用find_in_set
相关推荐
广州灵眸科技有限公司6 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒8 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手9 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
HLC++9 小时前
Linux的进程间通信
android·linux·服务器
段一凡-华北理工大学9 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh11 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562412 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898612 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD12 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo12 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程