当前位置: 首页 > news >正文

字节面试被问到“手机号存储选 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 开头的手机号,如果用 BigIntLong 类型),你需要先将它转为字符串,再进行模糊查询。这会大大增加查询的复杂度和性能损耗。

-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-

面试官的隐藏考察点

这道题不仅是对技术的考察,更考察你在设计数据库时的全面性思考,尤其是如何考虑

业务扩展性数据容错性

为什么 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)。如果字段长度过小,直接存储会导致数据截断,反而不利于清洗。

直接用 VARCHAR(11)

  • 设计妥协:如果强制使用 VARCHAR(11),你需要在代码层进行严格过滤,增加了复杂度和错误的可能性。

存储成本的考量:

  • VARCHAR(11) 最大占用 11 字节,VARCHAR(20) 最大占用 20 字节,两者差异不大,并且与 BIGINT 对比,总体差距可忽略不计。

-04-

日常开发避坑

字段长度设计过小

如果你硬要用 VARCHAR(11) 存纯手机号,碰到国际号、分机号等情况会直接崩盘。使用 VARCHAR(20) 更为灵活

字符集与排序规则选择不当

如果使用 utf8 字符集,无法存储 Emoji 或特殊符号。如果需要兼容所有 Unicode 字符,utf8mb4 是更优选择

索引设计不当

在手机号字段上没有加上唯一索引,可能导致重复数据。记得加上唯一索引,避免数据重复问题。

ALTER TABLE user_table ADD UNIQUE INDEX idx_phone (phone);

数据清洗与校验缺失

用户输入的手机号可能有空格、横杠等符号。建议入库前进行统一清洗,并使用正则校验格式。

String regex="^+?\\d{8,20}$"; // 允许带 + 号的 8~20 位数字

隐私与安全

明文存储手机号会泄露用户隐私。务必使用加密存储,并在显示时进行脱敏处理。

SELECT AES_ENCRYPT(phone_number, 'encryption_key') FROM user_table;

总结:思考全局,精确落地

  • 用 String 存手机号的优点:保真、灵活、省心。

  • VARCHAR(20) 优于 VARCHAR(11):为未来扩展留余地,避免格式问题。

  • 面试官看重的:业务扩展性、数据容错性、存储成本等综合考虑,体现你的全局思维。

面试时,如果你能展现出如此全面的思维,面试官肯定会对你刮目相看。别忘了,回答问题不仅是给出“对”的答案,更是展现你的思维深度与业务敏感度!

http://www.dtcms.com/a/269777.html

相关文章:

  • 区块链技术促进算力生态发展的具体案例
  • Python 机器学习核心入门与实战进阶 Day 6 - 模型保存与加载(joblib / pickle)
  • 2025年Linux安装MySQL详细教程
  • mysql-笔记
  • 服务器经常出现蓝屏是什么原因导致的?如何排查和修复?
  • Nature子刊:EPFL-ANU团队实现晶格对称性编程手性,双通道光学加密动态范围创1.6新高
  • Element-Plus-全局自动引入图标组件,无需每次import
  • 集群与集群应用
  • 东南亚主播解决方案|东南亚 TikTok 直播专线:纯净住宅 IP 、直播不卡顿
  • Spring自动装配(xml)
  • 芯片之后,AI之争的下一个战场是能源?
  • 小架构step系列08:logback.xml的配置
  • 知识库中如何确实嵌入文本块大小?语义完整性与检索颗粒度的平衡机制
  • 聊一聊软件架构师
  • C++排序算法全解析(加强版)
  • 单调栈通关指南:从力扣 84 到力扣 42
  • 前端技术小结
  • Android Jetpack Compose状态管理与状态提升
  • linux安装CUDA
  • VM文件管理与Vi/vim操作
  • multicore和multithreading
  • 多模态交互HMI全解析:语音、手势、眼动追踪的集成方案
  • rocketmq 刷盘机制 与同步机制区别
  • JavaScript之数组方法详解
  • VSYNC 深度解析
  • Apollo源码架构解析---附C++代码设计示例
  • 提炼总结—ROS2机器人开发(完结)
  • 【WEB】Polar靶场 16-20题 详细笔记
  • Python实现二分查找算法详解
  • 经典论文 Science子刊:数据驱动的偏微分方程发现 —— Supplementary Materials