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

如何在mysql中分配N个字节来存储整数,而不是4个字节或8个字节?,mysql,types,Mysql,Types,假设我想将印度手机号码存储在MySQL表中,因为记录的数量非常大,所以我想优化我的存储。 印度手机号码是10位数字,通常以7、8或9开头。 例如9xxxxxxxx 相关MySQL字段包括: Type Storage Minimum Value Maximum Value (Bytes) (Signed/Unsigned) (Signed/Unsigned) INT 4 -214748364

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

相关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 4-2147483648 2147483647

0 4294967295不要使用INT或BIGINT

有许多内置函数是MYSQL和php(我假设您使用的是php)

毕竟,如果你一定要选择,那么就使用

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


一种称为ICQ的IM,用于在数字字段中存储电话号码。我怎么知道?因为我的号码以0开头,电话号码不是真正的数字,因为我们不会对它们进行算术运算。整数和bigint等数量分别为4字节和8字节,因为计算机自然会以这样的大小进行算术运算


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

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

这里的经验法则是,除非你要做算术运算,或者你真的需要像“20>9”这样的比较才能为真,否则就把这些数据保留为字符


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

varchar的大小不是10+1=11字节吗?我一直在寻找任何整数解决方案都是可能的。另外,如果考虑到cpu无休止地将字符转换为二进制再转换回二进制的“费用”,5字节磁盘空间的“节省”将是一种损失。