让我们假设我想将印度手机号码存储在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
如图所示,无符号INT略小(约为值的一半),无符号BIGINT非常大,可存储10位数。 5个字节足以存储此数据。
我的问题是: -
a)是否有一种很好的方法来分配自定义字节数并将这些数据存储在任何类型的可用数据类型的MYSQL中?
b)这是不成熟的优化吗?是否有任何优势/劣势试图做到这一点?
c)使用自然大小数据类型(如4字节和8字节数),忽略数据库中的5字节和6字节等中间大小有什么好处?
注意:假设10位数字不是电话号码,而是10位数字整数。 VARCHAR不是我想要的。
答案 0 :(得分:3)
我同意@diEcho你应该使用VARCHAR()来获取电话号码。在我的有生之年,我有6位数字,7位数字,9位数字(因为我经常在不同的县,需要提供国家代码和我的号码)13位数字。
这里的经验法则是,除非您要进行算术运算,否则您确实需要比较“20> 9”这样的比较,然后将此数据保留为字符。
如果你遇到一个类似的问题,你需要一个不容易适应INT或BIGINT的固定位数,并且你需要进行数值比较,那么只需使用DECIMAL(没有十进制说明符),如DECIMAL(9) 。
答案 1 :(得分:2)
电话号码(与姓名相反)不是号码。电话号码,邮政编码,序列号等是文本数据,因此您应将其存储为文本(CHAR(10)/ VARCHAR(10 + reserve) - ascii collation)。这当然会产生更大的存储要求,但会是那么大吗?你还会存储多少个数字?
IM称为ICQ,用于在数字字段中存储电话号码。我怎么知道的?因为我的号码以0开头
答案 2 :(得分:1)
电话号码不是真正的数字,因为我们不会对它们进行算术运算。诸如INT和BIGINT之类的数量是4和8字节,因为计算机自然会以这样的大小进行算术运算。
自然要做的是将电话号码视为CHAR(10)。您可能认为这是低效的 - 使用10个字节,其中5会做,但考虑到您的整体数据量(当然其他数据如名称和地址要大得多?)我怀疑每个记录“浪费”5个字节会花费多少钱许多。磁盘空间便宜,程序员时间昂贵,做最简单的工作。
答案 3 :(得分:0)
不要使用INT OR BIGINT ...使用 VARCHAR(10)并在插入数据库之前清理数据..
有许多内置函数是MYSQL和php(我假设你使用的是php)
毕竟如果你一定要选择那么就用
BIGINT UNSIGNED