大家好,我是小米,一个31岁依旧热爱写代码、讲技术、聊八卦的程序员。
这篇文章灵感来源于上周五晚上我朋友小陈的电话。那天我正一边撸串,一边回味《庆余年2》,突然电话响了:
“小米哥,我今天社招面试遇到个问题,把我整懵了。你知道MySQL有哪些数据类型吗?还有,实际开发中该怎么用?”
我一听,乐了。
这不就是每年都要考、每年都有人踩坑、但又没人能说全的问题吗?于是我拍拍胸脯说:等我吃完串,写篇文章送给你!你先憋着!
于是有了这篇文章。
社招面试现场:数据类型引发的“灵魂三问”
先简单讲讲小陈的面试场景。
小陈是一名有5年经验的Java后端开发,简历上写着熟练掌握MySQL、Redis、Spring全家桶。但他面试时,面试官只轻描淡写地问了句:
“你说说MySQL有哪些数据类型?”
小陈当时脑袋一热,说了几个:“int、varchar、text、datetime…”
面试官紧接着补刀:
“那varchar和char的区别你能讲讲吗?”
“你知道decimal和float用哪个更适合存金额?”
“text类型能建索引吗?longtext可以吗?”
这时候,小陈一脸尴尬地笑了笑——笑着笑着,就被挂了。
挂得他很不服!
但我说:别气。这不是你一个人的问题。很多社招的同学,到了中高级阶段,反而容易忽略基础知识的深度和落地策略。
那我们就用这篇文章,一次性给你说透!
MySQL 数据类型大全(高频+易错)
MySQL 的数据类型主要分三大类:
- 数值类型(Numeric)
- 字符串类型(String)
- 日期/时间类型(Date & Time)
下面咱们一边讲类型,一边穿插“使用策略”。
数值类型:int、float、decimal怎么选?
策略总结:
- 金额必须用 DECIMAL,不能用 FLOAT 或 DOUBLE,因为浮点数存在精度误差,可能引发财务事故;
- 自增主键推荐用 BIGINT(尤其用户量大的系统),别用 INT 太早就溢出;
- 状态码用 TINYINT 就够了,别浪费空间。
字符串类型:varchar、char、text的江湖地位
策略总结:
- 大部分场景都用 VARCHAR;
- CHAR 适用于长度固定、频繁查询的字段;
- TEXT 不能直接建索引,除非加 FULLTEXT 或使用 前缀索引(如 VARCHAR(255));
- TEXT 不能设置默认值,这一点很多人都忘了!
时间类型:datetime、timestamp 用哪个?
策略总结:
- 绝大多数业务场景推荐用 DATETIME,不会受时区干扰;
- TIMESTAMP 用于记录自动更新字段(如 create_time DEFAULT CURRENT_TIMESTAMP);
- 尽量统一时间存储格式,避免团队混用出问题。
面试延伸题:varchar(255)是个“玄学”?
你有没有好奇,为什么很多字段都写成 varchar(255)?
这是个“历史遗留”的玄学问题。
在 MySQL 早期版本中,InnoDB 表的行格式(row format)对 varchar 长度有限制(65535字节) ,而且部分版本在 UTF-8 下最多支持 varchar(21844),但 255 是一个兼容性最强的数值。
于是久而久之,大家都习惯写成 varchar(255),哪怕只用到几十个字符。
最佳实践:
- 不要迷信 255,根据实际字段长度来定;
- 用户名最长能有多长?40字符够了吧?就用 varchar(40)!
这样能节省空间、提升缓存命中率,还能让索引结构更紧凑。
别踩这些“数据类型陷阱”!
1. 定义字段时用 INT(11) 就是 11 位数字?
错!
INT(11) 中的 11 和显示宽度有关(必须和 ZEROFILL 一起用才有意义),跟能存多少位数毫无关系。
所以 INT(11) ≠ 十一位整数,它的最大值就是 2,147,483,647,和 INT 是一样的!
2. 用 ENUM 存状态码?
尽量别用!虽然节省空间,但维护、扩展极不方便。未来多一个状态还得改表结构。
推荐还是用 TINYINT + 枚举类(Java Enum)管理状态,更灵活。
3. 过度使用 TEXT / BLOB
TEXT 不能建索引、不能默认值、存储效率低,别乱用。
比如评论内容、长描述可以用 TEXT,但短的就用 VARCHAR(n),性能更好。
面试中的“反杀”套路
还记得文章开头的小陈吗?在我给他讲完这篇文章后,他面试又约了一场。
这次,面试官又问他:
“你说说MySQL有哪些数据类型?”
小陈淡定回答不止,还加了优化建议和实际场景策略。结果面试官点头说:
“你对基础掌握得挺透的。”
就这句,小陈直接进了复试!
总结
MySQL 数据类型虽基础,但极具门道。
基础题是最能体现工程经验的地方,尤其是社招面试中,面试官更看你能不能“说出业务场景下的使用策略”。
- 熟悉每种类型的特点;
- 避免历史“玄学”;
- 多想一层:这个字段值的业务范围是多少?未来会扩展吗?是否要建索引?是否经常查询?
这些思维,才是中高级程序员的“底层能力”。
END
如果你觉得这篇文章对你有帮助,欢迎点赞、分享给更多准备社招的朋友!
你还希望我写哪类面试题?欢迎评论区告诉我!
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!