前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql存储手机号为什么不用bigint?

mysql存储手机号为什么不用bigint?

作者头像
韩旭051
发布于 2021-10-13 06:26:01
发布于 2021-10-13 06:26:01
3.5K00
代码可运行
举报
文章被收录于专栏:刷题笔记刷题笔记
运行总次数:0
代码可运行

在使用utf8字符编码的情况下:

char(11) 用来存储手机号,会占用11 bytes bigint 用来存储手机号,会占用 8 bytes varchar(11)用来存储手机号,会占用 12 bytes

从容量和速度上看,bigint是最好的选择。

从扩展性上看,如果有国际区号,业务上也不会带着国际区号去查询,国际区号也可以放在另一列。

因此,为什么不使用bigint存储手机号呢?

手机号一般是要加索引的吧。。bigint你用了like索引就失效了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.首先,手机号的本质是字符串而不是数字,只是恰巧长得像数字而已。(网上百度的,我也不知道三大运行商是怎么储存的)

2.字符串可以通过LINK去匹配,查询很方便。

3.字符串可以去匹配尾号或者首号。

4.32位的某些应用中,bigint太大,会溢出,要进行各种转换,很麻烦。

5.手机号可能有-(座机),用int存不了。

char(32)

varchar(32)

占用空间

固定 32 字符(如果数据长度不够 32 将用空格补齐)

跟随实际存储内容长度,但不超过 32

空格处理

检索时会去掉尾部空格(数据本身有空白符也会被去掉)

不会对空格处理

是否记录字段长度

是。额外拿出空间记录字段数据长度(字符数)

适用场景

存储的数据长度基本一致,不需要空格,eg 手机号、UUID、密码加密后的密文

数据长度不一定,长度范围变化较大的场景

bigint的优势有:

更小的空间占用; 更高的操作效率(待验证); 支持更多的操作,比如between and操作; VARCHAR的优势:

灵活;设计时候可以指定最大长度,存储时,存多少占用多少; CHAR的优势:

效率比varchar更高; 假设我们将字段内容设计为 地区编码(4位)+手机号或者区号座机号(11位)的格式,那么该字段内容固定位15位长度:

空间:

bigint:8字节 VARCHAR:15字节 CHAR:15字节 bigint > varchar = char

效率猜测:

bigint > char > varchar

扩展性:

bigint:最多19位,实际使用15位,还有至少3位扩展空间(最高位如果拿来用时,其他位是有可能溢出的) varchar:扩展性根据创建时候指定 char:没有扩展性 varchar > bigint > char

测试结果反转了我对操作效率的认知,实际为:

varchar >= char > bigint;

这样一来,char唯一可能的优势(效率)就不复存在了,bigint的优势也只剩下:

空间占用; 支持between and操作; 对于bigint的优势,对其进行分析:

空间占用:对于一个存放4位区号(不太可能,这里取4位为了计算最大的空间占用差距)和11号码的bigint和varchar,一个号码bigint 8Byte,varchar 15Byte,差距7Byte,假设中国是精确的十三亿人口,每人存放一条手机号码信息:差距就是:9100000000Byte,换算一下不到8.5GB,数据冗余备份共3个副本的话,就是25.5GB;节省的空间相当有限,因为其本身占用空间就不大,相信这个空间节省很难打动一个拥有13亿数据量的应用,将手机号存储切换至bigint; 这还是考虑到4位区号的情况下,如果不考虑区号,不计算副本,空间节省将变成不到3.7GB;实在难以让人心动;

支持between and操作这个优势,varchar也能使用正则表达式来实现相同的功能;或许在这一点上,bigint效率会高于varchar?这也许又是另一个话题了,但无论如何,bigint始终没有达到我对插入、查询方面的效率改进的预期;

综上,bigint没有足够多的优势打动我去使用bigint存储手机号,虽然很不甘心,当初次萌生这个想法的时候是相当兴奋的,觉得好像发现了新大陆,但是不得不将使用bigint存放手机号这个想法给打消;或许下次我应该试试使用int来存储手机号;

不存储区号;如果需要区号,分库或者分表的要求是非常合理的;甚至服务器本身都不会在同一个地区; 省略手机号开头的1(国内还没有看到1以外的数字开头的手机号,国外情况未知),这样就只剩下10位了,依然不够,第二位从0到9分库分表,还剩下9位,这对于int来说,能够存储了; 我一直认为对于数字的处理,交给数字类型比较好,所有才会有这样的想法,int对比varchar总该有性能提升吧;当然这样做,也有局限性:

实现起来变麻烦了,不过对于13亿数据量来说本身就应该分表了,一张表200w数据后就可能操作起来显著变慢;可是涉及到所有有手机号的字段都需要建立0~9 10个分表,这实在是代价有点大;也不能varchar和int混用,否则int那点可能存在的效率上的优势会被转换消化掉;

没有扩展性,如果将来手机号演变为2开头,那就麻烦啦;当然按照人口发展规律,可能性不大;但是另一个恐怖的念头展现在我脑海中了,那就是物联网,如果要给每个接入物联网的设备一个唯一号码呢?那int实现的扩展性将是致命的;

分析下来,int或许有些许性能优势,但其带来的复杂度和扩展上的劣势让我根本都不必动手,就打消了念头了;唉,也许这就是为什么大多数公司选择varchar存储手机号的原因吧;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/07/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-01-06:mysql中,我存十亿个手机号码...
1.对于 bigint 类型,如果不为 NULL,则占用8字节,首位为符号位,剩余位存储数字,数字范围是 -2^63 ~ 2^63 - 1 = -9223372036854775808 ~ 9223372036854775807。如果为 NULL,则不占用任何存储空间。
福大大架构师每日一题
2021/01/06
1K0
每日一面 - mysql中,我存十亿个手机号码,考虑存储空间和查询效率,怎么设计?
假设表只有一个字段,就是手机号 phone,并且设置为主键。如果不设置主键并且没有唯一索引,InnoDB 会给我们自动生成一个隐藏主键列,浪费空间。
干货满满张哈希
2021/04/12
8730
mysql标准规范
(1)对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层
红目香薰
2022/11/29
3870
Mysql 军规升级版
为什么80%的码农都做不了架构师?>>> 一、基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1) 通用,无乱码风险,汉字3字节
北漂的我
2019/05/29
6360
58到家MySQL军规升级版
一、基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集,有存储4字节例如表情符号时,使用它 禁止使用存储过程,视图,触发器,Event 解读: (1)对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层 (2)调试,排错,迁移都比较困难,扩展性较差 禁止在数据库中存储大文件,例如照片,可以将大文件存储在对象存储系统,数据库中存储路径 禁止在线上
架构师之路
2018/04/19
1.4K0
MySQL性能优化(二):优化数据库的设计
数据库编码: 尽量采用utf8mb4而不使用utf8。MySQL 的“utf8”实际上不是真正的UTF-8,真正的UTF-8是每个字符最多四个字节,而MySQL的“utf8”只支持每个字符最多三个字节。
码农架构
2020/10/29
2.1K0
MySQL性能优化(二):优化数据库的设计
Mysql入门(二)
MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。 许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)。
epoos
2022/06/06
9360
Mysql入门(二)
MySQL必知必会知识点总结一二
1、DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、 数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter 等。
Java后端技术
2018/08/09
8440
MySQL必知必会知识点总结一二
Mysql命名规范
基础规范 表存储引擎必须使用 InnoDB 表字符集默认使用 utf8,必要时候使用 utf8mb4 说明: 1)通用,无乱码风险,汉字3字节,英文1字节 2)`utf8mb4` 是 `utf8` 的超集,有存储 4 字节例如表情符号时,使用它 复制代码 禁止使用存储过程,视图,触发器,Event 说明: 1)对数据库性能影响较大,互联网业务,能让站点层和服务层干的事情,不要交到数据库层 2)调试,排错,迁移都比较困难,扩展性、移植性较差 复制代码 禁止在数据库中存储大文件,例如照片,可以
OwenZhang
2021/12/08
8.1K2
【MySQL】MySQL常见数据类型
从这个数值类型我们也可以发现,这其实也是一种约束。如果我们向mysql特定的类型中插入不合法的数据,MySQL一般会直接拦截相应的操作。这种类型的约束,也可以保证数据库中的数据是可预期的、完整的。
P_M_P
2024/08/12
1580
【MySQL】MySQL常见数据类型
mysql工程师之04 数据类型
取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。
张哥编程
2024/12/13
1360
mysql数据类型详解(1)
优化设计不良或索引不佳的架构能把性能提升几个数量级。如果需要高性能,就必须运行特定的查询设计架构和索引,还要评估不同类型查询的性能要求,因为更改某个查询或架构的一部分会对其他部分造成影响。例如,为了加快数据读取而添加的索引会减慢更新的速度。 选择优化的数据类型 遵循以下原则有助于更好的选择合适的数据类型 更小通常更好 更小的数据类型通常更快,因为他们使用更少的磁盘空间,内存和cpu缓存,而且需要的cpu周期更少 简单就好 越简单的数据类型,需要的cpu周期就越少。例如,比较整数的代价小于比较字符,因为字符集
wangxl
2018/03/08
9970
【MySQL】数据库的数据类型
mysql 中表的建立属性列:列名称 数据类型,例如 num int,它与我们平时写的语言数据类型是倒过来的!
YoungMLet
2024/03/01
2570
【MySQL】数据库的数据类型
MySQL数据类型详解
如果是GBK编码,则一个中文汉字占2个字节,英文占1个字节 如果是UTF8编码,则一个中文汉字占3个字节,而英文字母占1字节。 比如定义某个字段数据类型为:varchar(32),表示这个可以存储 32 个字符,此时表示的是字符,所以跟中英文无关,也就是该字段可以存储 32 个中文,或者是 32 个英文,或者是 32 个中文和英文的混搭都行。但如果字符数超过 32 个的话就会报错。
终有救赎
2023/10/16
3770
MySQL数据类型详解
(转)MySQL之char、varchar和text的设计
http://www.cnblogs.com/billyxp/p/3548540.html
Dar_Alpha
2018/09/03
2.3K0
MYSQL数据库-数据类型
MYSQL数据库-数据类型 零、前言 一、数据类型分类 二、数据库的字段属性 三、数值类型 1、tinyint类型 2、bit类型 3、float类型 4、decimal类型 四、字符串类型 1、char类型 2、varchar类型 3、char和varchar比较 4、日期和时间类型 5、enum和set类型 零、前言 本章主要讲解学习MYSQL数据库的数据类型 一、数据类型分类 数据类型示图: 二、数据库的字段属性 所谓字段属性就是用来修饰数据类型的 主要的字段属性: UnSigned
用户9645905
2022/11/15
2.9K0
MYSQL数据库-数据类型
MySQL基础数据类型
  存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
changxin7
2022/05/06
5K0
MySQL基础数据类型
从零开发区块链应用(二)--mysql安装及数据库表的安装创建
数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。有一些数据是要存储为数字的,数字当中有些是要存储为整数、小数、日期型等...
Tiny熊
2022/02/22
1.5K0
Mysql开发规范
命名规范的对象,是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等
用户3876103
2024/11/03
1260
mysql架构sql基础
clear \c 在客户端有命令打错的情况后面跟上相当于ctrl+c 在5.6中ctrl+c就退出客户端了
萧晚歌
2021/11/30
9080
相关推荐
2021-01-06:mysql中,我存十亿个手机号码...
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验