首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何分配N字节来存储整数,而不是mysql中的4字节或8字节?

如何分配N字节来存储整数,而不是mysql中的4字节或8字节?
EN

Stack Overflow用户
提问于 2011-07-29 16:09:10
回答 4查看 1.3K关注 0票数 3

假设我想要将印度手机号码存储在一个MySQL表中,因为记录的数量非常大,所以我想优化我的存储。印度的移动电话号码是10位数字,通常以7、8或9开头。例如9XXXXXXXXX

相关的MySQL字段有:

代码语言:javascript
运行
复制
Type    Storage     Minimum Value            Maximum Value
           (Bytes)        (Signed/Unsigned)     (Signed/Unsigned)

INT      4         -2147483648                2147483647
                           0                  4294967295 <-- somewhat small

BIGINT   8       -9223372036854775808       9223372036854775807
                       0                18446744073709551615 <-- too large

如图所示,unsigned INT较小(大约值的一半),而unsigned BIGINT非常大,可以存储10位数。5个字节足以存储此数据。

我的问题如下:

a)有没有一个好的方法来分配自定义的字节数,并在MYSQL中以任何类型的可用数据类型存储这些数据?

b)这是不是过早的优化?尝试这样做有没有什么好处/坏处?

c)在数据库中使用自然大小的数据类型(如4字节和8字节数字)并忽略中间大小(如5字节和6字节)的好处是什么?

注意:假设10位数字不是电话号码,而是一个10位整数。VARCHAR不是我要找的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-29 16:28:03

我同意@diEcho的观点,即您应该对电话号码使用VARCHAR()。在我的一生中,我有6位数字,7位数字,9位数字和13位数字(因为我经常在不同的县,需要给出国家代码和我的号码)。

这里的经验法则是,除非你要做算术运算,或者你真的需要像"20 > 9“这样的比较为真,否则就把这个数据作为字符。

如果您遇到类似的问题,您需要固定数量的数字,而这些数字不太适合INT或BIGINT,并且您需要进行数字比较,那么只需使用DECIMAL (不带decimal说明符),就像DECIMAL(9)一样。

票数 3
EN

Stack Overflow用户

发布于 2011-07-29 16:19:07

电话女郎(与其名称相反)不是一个数字。电话号码、邮政编码、序列号等都是文本数据,因此您应该将其存储为文本(CHAR(10)/VARCHAR(10+reserve) - ascii排序规则)。当然,这将导致更大的存储需求,但会有那么大吗?你到底要存储多少个数字?

名为ICQ的IM用于在数字字段中存储电话号码。我怎么知道的?因为我的号码从0开始

票数 2
EN

Stack Overflow用户

发布于 2011-07-29 16:22:49

电话号码不是真正的数字,因为我们不会对它们进行算术运算。像INT和BIGINT这样的数量是4字节和8字节,因为计算机自然地使用这样的大小进行算术运算。

最自然的做法是将电话号码视为一个CHAR(10)。您可能会认为这是低效的-使用10个字节,而5个字节就可以了,但是考虑到您的总体数据量(难道其他数据,如名称和地址,会更大吗?)我怀疑“浪费”每条记录5个字节的成本会很高。磁盘空间很便宜,程序员的时间很昂贵,做最简单的事情就可以了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6870309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档