【问题标题】:How to assign N bytes to store integer instead of 4 bytes or 8 bytes in mysql?如何在mysql中分配N个字节来存储整数而不是4个字节或8个字节?
【发布时间】:2011-07-29 08:09:09
【问题描述】:

假设我想将印度手机号码存储在 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 不是我想要的。

【问题讨论】:

    标签: mysql types


    【解决方案1】:

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

    这里的经验法则是,除非您要进行算术运算,或者您确实需要像“20 > 9”这样的比较为真,否则将这些数据保留为字符。

    如果您遇到类似的问题,您需要固定数量的数字,而这些数字不容易适合 INT 或 BIGINT,并且您需要进行数字比较,则只需使用 DECIMAL(不带小数说明符),如 DECIMAL(9) .

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        很自然的做法是将电话号码视为 CHAR(10)。您可能认为这是低效的 - 使用 10 个字节,而 5 个字节可以,但考虑到您的整体数据量(肯定其他数据,如姓名和地址要大得多?)我怀疑每条记录“浪费”5 个字节会花费很多。磁盘空间很便宜,程序员的时间很贵,做最简单的事情。

        【讨论】:

        • 如果考虑到 CPU 无休止地将字符转换为二进制然后再返回的“费用”,那么“节省”5 个字节的磁盘空间将是一种损失。
        【解决方案4】:

        不要使用 INT OR BIGINT..使用 VARCHAR(10) 并在插入数据库之前清理数据..

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

        毕竟如果你一定要选择然后使用

        BIGINT UNSIGNED
        

        【讨论】:

        • varchar 的大小不会是 10+1 = 11 字节吗?我一直在寻找任何可能的整数解决方案。
        猜你喜欢
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 2021-09-04
        • 1970-01-01
        • 2019-02-12
        • 2018-12-16
        • 2023-02-24
        相关资源
        最近更新 更多