-
字节面试被问到“手机号存储选 Int 还是 String”!
- 网站名称:字节面试被问到“手机号存储选 Int 还是 String”!
- 网站分类:技术文章
- 收录时间:2025-08-03 01:41
- 网站地址:
“字节面试被问到“手机号存储选 Int 还是 String”!” 网站介绍
最近,一位粉丝告诉我,他在面试字节时,被问到了一道存储手机号的问题:用 int 还是 string,用 varchar 还是 char?
这道题虽然看似简单,但其实是面试官隐形考察业务扩展性、数据容错性和全面思维的关键。
结果,他的回答让面试官脸色凝重,最后没通过。
所以,今天我也来跟大家聊聊这个问题,带大家一起来理清思路,教你如何在面试时留下深刻印象。
-01-
用 Int 存储存在哪些问题?
1 int存不下 11 位的手机号?
首先,我们都知道手机号是 11 位数字,比如 13728199213。
但如果用 int 类型,它的范围只有 2,147,483,647,远远无法存下 13728199213。因此,根本不适合存储手机号。
要存得下,需要用 64 位 的 Long 类型,或者数据库中的 bigInt。但是,直接用 Long 存真的没有问题吗?
2 数据完整性问题:前导零丢失
例如手机号 01324567890,用 Long 存储时,前导零就丢失了,变成了 1324567890,这严重影响数据的完整性。
再者,手机号可能包含国家代码如 +86,或者有分隔符如 137-2819-9213,这些都无法直接存入整数类型中。
3 查询问题:模糊查询成本高
假设你要查找 137 开头的手机号,如果用 BigInt(Long 类型),你需要先将它转为字符串,再进行模糊查询。这会大大增加查询的复杂度和性能损耗。
-02-
选用 String 存储手机号
用 String 存手机号的好处
- 保真:数字、符号、前导零都能完整存储。
- 灵活:支持模糊查询、国际号码,且未来扩展无忧。
- 省心:无需担心溢出或格式转换问题。
String的存储示例
CREATE TABLE user_table (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',
phone_number VARCHAR(20) NOT NULL COMMENT '手机号',
PRIMARY KEY (id),
UNIQUE KEY idx_phone (phone_number)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-03-
面试官的隐藏考察点
这道题不仅是对技术的考察,更考察你在设计数据库时的全面性思考,尤其是如何考虑
业务扩展性和数据容错性。
1 为什么 VARCHAR(20)而不是 VARCHAR(11)?
我们知道,手机号通常是11位,但为何用 VARCHAR(20) 作为字段长度,而不是 VARCHAR(11)?
业务扩展性:不仅仅是手机号
假设未来你需要支持:
- 国际号码(如 +8613822223333,14位)
- 带国家码的号码(如 008613822223333,15位)
- 分机号(如 13822223333#123)
如果用 VARCHAR(11),这些情况都会导致存储错误。而 VARCHAR(20) 可以轻松兼容各种国际化需求,支持更长的号码和格式,避免后期修改表结构。
数据容错性:用户输入的不可控性
用户输入的手机号可能带有空格、符号(如 138 2222 3333 或 137-2222-3333)。如果字段长度过小,直接存储会导致数据截断,反而不利于清洗。
2 直接用 VARCHAR(11)?
- 设计妥协:如果强制使用 VARCHAR(11),你需要在代码层进行严格过滤,增加了复杂度和错误的可能性。
3 存储成本的考量:
- VARCHAR(11) 最大占用 11 字节,VARCHAR(20) 最大占用 20 字节,两者差异不大,并且与 BIGINT 对比,总体差距可忽略不计。
-04-
日常开发避坑
1 字段长度设计过小
如果你硬要用 VARCHAR(11) 存纯手机号,碰到国际号、分机号等情况会直接崩盘。使用 VARCHAR(20) 更为灵活。
2 字符集与排序规则选择不当
如果使用 utf8 字符集,无法存储 Emoji 或特殊符号。如果需要兼容所有 Unicode 字符,utf8mb4 是更优选择。
3 索引设计不当
在手机号字段上没有加上唯一索引,可能导致重复数据。记得加上唯一索引,避免数据重复问题。
ALTER TABLE user_table ADD UNIQUE INDEX idx_phone (phone);
4 数据清洗与校验缺失
用户输入的手机号可能有空格、横杠等符号。建议入库前进行统一清洗,并使用正则校验格式。
String regex="^+?\\d{8,20}#34;; // 允许带 + 号的 8~20 位数字
5 隐私与安全
明文存储手机号会泄露用户隐私。务必使用加密存储,并在显示时进行脱敏处理。
SELECT AES_ENCRYPT(phone_number, 'encryption_key') FROM user_table;
总结:思考全局,精确落地
- 用 String 存手机号的优点:保真、灵活、省心。
- VARCHAR(20) 优于 VARCHAR(11):为未来扩展留余地,避免格式问题。
- 面试官看重的:业务扩展性、数据容错性、存储成本等综合考虑,体现你的全局思维。
面试时,如果你能展现出如此全面的思维,面试官肯定会对你刮目相看。别忘了,回答问题不仅是给出“对”的答案,更是展现你的思维深度与业务敏感度!
更多相关网站
- 10个SQL优化技巧,性能提升300%(sql优化从哪几方面入手)
- 面试官问你 MySQL 的线上执行 DDL 该怎么做?...
- MySQL 8.0 的隐藏索引:索引管理的利器,还是性能陷阱?
- MySQL实战:Json字段类型详解(mysql中json类型)
- Spring事务失效的12种解决方案!15年踩坑经验浓缩成这份避雷指南
- 面试官:select语句和update语句分别是怎么执行的?
- 详细了解 InnoDB 内存结构及其原理
- 深度剖析 Spring Boot3 中事务失效的场景与解决方案
- java 使用Jdbc连接mysql数据库以及其存在的问题
- 百万订单背后的架构生死局:SpringCloud Alibaba拯救我们的微服务
- 面试官:20 亿手机号存储选 int 还是 string?varchar 还是 char?
- 面试官:MySQL的自增ID用完了,怎么办?
- 别再用雪花算法生成ID了!试试这个吧
- # mysql 中文乱码问题分析(#mysql5.0中文乱码)
- MySQL分页到了后面越来越慢,有什么好的解决办法?
- Spring Boot3 中实现树表结构数据查询及返回全解析
- SQL外连接优化:经过验证的性能提升
- zPaaS低代码平台使用介绍:第一个功能开发
- 最近发表
- 标签列表
-
- mydisktest_v298 (35)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 二调符号库 (23)
- acmecadconverter_8.52绿色版 (25)
- 梦幻诛仙表情包 (36)
- java面试宝典2019pdf (26)
- disk++ (30)
- 加密与解密第四版pdf (29)
- iteye (26)
- centos7.4下载 (32)
- intouch2014r2sp1永久授权 (33)
- usb2.0-serial驱动下载 (24)
- jdk1.8.0_191下载 (27)
- axure9注册码 (30)
- virtualdrivemaster (26)
- 数据结构c语言版严蔚敏pdf (25)
- 兔兔工程量计算软件下载 (27)
- 代码整洁之道 pdf (26)
- ccproxy破解版 (31)
- aida64模板 (28)
- engine=innodb (33)
- shiro jwt (28)
- 方格子excel破解版补丁 (25)