假设我想要将印度手机号码存储在一个MySQL表中,因为记录的数量非常大,所以我想优化我的存储。印度的移动电话号码是10位数字,通常以7、8或9开头。例如9XXXXXXXXX
。
相关的MySQL字段有:
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不是我要找的。
发布于 2011-07-29 16:28:03
我同意@diEcho的观点,即您应该对电话号码使用VARCHAR()。在我的一生中,我有6位数字,7位数字,9位数字和13位数字(因为我经常在不同的县,需要给出国家代码和我的号码)。
这里的经验法则是,除非你要做算术运算,或者你真的需要像"20 > 9“这样的比较为真,否则就把这个数据作为字符。
如果您遇到类似的问题,您需要固定数量的数字,而这些数字不太适合INT或BIGINT,并且您需要进行数字比较,那么只需使用DECIMAL (不带decimal说明符),就像DECIMAL(9)一样。
发布于 2011-07-29 16:19:07
电话女郎(与其名称相反)不是一个数字。电话号码、邮政编码、序列号等都是文本数据,因此您应该将其存储为文本(CHAR(10)/VARCHAR(10+reserve) - ascii排序规则)。当然,这将导致更大的存储需求,但会有那么大吗?你到底要存储多少个数字?
名为ICQ的IM用于在数字字段中存储电话号码。我怎么知道的?因为我的号码从0开始
发布于 2011-07-29 16:22:49
电话号码不是真正的数字,因为我们不会对它们进行算术运算。像INT和BIGINT这样的数量是4字节和8字节,因为计算机自然地使用这样的大小进行算术运算。
最自然的做法是将电话号码视为一个CHAR(10)。您可能会认为这是低效的-使用10个字节,而5个字节就可以了,但是考虑到您的总体数据量(难道其他数据,如名称和地址,会更大吗?)我怀疑“浪费”每条记录5个字节的成本会很高。磁盘空间很便宜,程序员的时间很昂贵,做最简单的事情就可以了。
https://stackoverflow.com/questions/6870309
复制相似问题