有个网友去面试了字节,被问了这么一道题,20亿手机号存储,选int还是string?varchar还是char?为什么?
他支支吾吾回答了几句,好像看起来,面试官面色凝重,对他不是很满意,果然最后还是挂了。。。
本文跟大家聊聊我的思路。
20亿数据,用Int存储存在哪些问题?
面试官的隐藏考察点
日常开发避坑点
1.20亿数据,用Int或者BigInt能有在哪些问题?1.1int存得下11位数字嘛?
首先,我们都知道手机号,是11位的数字,比如.
在Java中,int是32位,最大值为2^31-1=2,147,483,647。约等于2×10⁹。显然,如果用int,根本存不下11位的手机号码。
要想存得下,得用64位的Long类型,也就是对应数据库的bigInt。
1.2数据完整性
例如手机号01324567890,用Long存会变成1324567890,直接破坏数据完整性。
LongphoneNumber=01324567890L;//编译报错,Java不允许前导0的Long整数
并且,有时候,有些手机号可能包含国家代码如(+86),或者有些时候,是有连字符的,比如.这些原因都导致不能用整型类型存储。
1.3查询麻烦
比如,你要查找,手机号是137开头的手机号号码,如果用BigInt(Long类型)需先转字符串再模糊匹配,效率暴跌。
2.用String有哪些好处保真:数字、符号、前导零全能存,原样保留。
灵活:支持模糊查询、国际号码,扩展无忧。
省心:无需担心溢出或格式转换问题。
CREATETABLEuser_tab(idBIGINTUNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'用户ID',phone_numberVARCHAR(20)NOTNULLCOMMENT'手机号',PRIMARYKEY(id),UNIQUEKEYidx_phone(phone_number))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='用户表';2.面试官的隐藏考察点
面试的时候,面试官主要考察候选人的一些业务扩展性、数据容错性、思考问题全面性等能力。我们先通过:为什么用VARCHAR(20)而不是VARCHAR(11),来给面试官秀一波肌肉~~
2.1为什么用VARCHAR(20)而不是VARCHAR(11)
我们就拿手机号来说,为什么更建议用VARCHAR(20),而不是VARCHAR(11)呢?
因为我们都知道,手机号是11位的,为什么不直接用VARCHAR(11)呢?
如果你日常开发中,就有思考数据容错性习惯的话,就会想到:
如果遇到国际号码:+86(14位)
带国家码的号码:0086(15位)
分机号:123)。'
3.2字符集和排序规则
使用utf8字符集,无法存储emoji或特殊符号
用utf8mb4+utf8mb4_unicode_ci,兼容所有Unicode字符(如+*34;;//宽松校验(允许带国际码,如+86)StringlooseRegex="^(\\+\\d{1,3})?1(3\\d|4[579]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}#34;;