【问题标题】:What is the difference between tinyint, smallint, mediumint, bigint and int in MySQL?MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别?
【发布时间】:2011-02-28 19:16:13
【问题描述】:

MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别?

在什么情况下应该使用这些?

【问题讨论】:

    标签: mysql integer


    【解决方案1】:

    它们占用不同数量的空间,并且具有不同的可接受值范围。

    Here are the sizes and ranges of values for SQL Server,其他 RDBMS 也有类似的文档:

    事实证明,它们都使用相同的规范(下面提到了一些小例外),但支持这些类型的各种组合(不包括 Oracle,因为它只有一个 NUMBER 数据类型,请参阅上面的链接):

                 | SQL Server    MySQL   Postgres    DB2
    ---------------------------------------------------
    tinyint      |     X           X                
    smallint     |     X           X         X        X
    mediumint    |                 X
    int/integer  |     X           X         X        X 
    bigint       |     X           X         X        X
    

    并且它们支持相同的值范围(下面有一个例外)并且都具有相同的存储要求:

                | Bytes    Range (signed)                               Range (unsigned)
    --------------------------------------------------------------------------------------------
    tinyint     | 1 byte   -128 to 127                                  0 to 255
    smallint    | 2 bytes  -32768 to 32767                              0 to 65535
    mediumint   | 3 bytes  -8388608 to 8388607                          0 to 16777215
    int/integer | 4 bytes  -2147483648 to 2147483647                    0 to 4294967295
    bigint      | 8 bytes  -9223372036854775808 to 9223372036854775807  0 to 18446744073709551615 
    

    “无符号”类型仅在 MySQL 中可用,其余仅使用有符号范围,有一个值得注意的例外:SQL Server 中的tinyint 是无符号的,取值范围为 0到 255

    【讨论】:

    • 我不知道无符号类型仅在 MySQL 中可用,这是 MySQL 相对于其他 RDBMS 的巨大优势。自发布此答案之日起,有什么变化吗?
    • @Daniel,他们在想什么,为什么 3 个字节有一个,而 6 个字节没有一个?
    • @Pacerier 可能他们不知道如何命名它:))
    • 他们应该把 that 称为 bigint 而不是 bigint,而是一个 humongousint。
    • greatint 可能是一个选择,因为甲骨文是一家美国公司。 :)
    【解决方案2】:

    所需的存储大小以及有多大

    在 SQL Server 上:

    • tinyint1字节,0到255
    • smallint 2 个字节,-215 (-32,768) 到 215-1 (32,767)
    • int 4 个字节,-231 (-2,147,483,648) 到 231-1 (2,147,483,647)
    • bigint 8 个字节,-263 (-9,223,372,036,854,775,808) 到 263-1 (9,223,372,036,854,775,807)

    您可以在所有 4 个中存储数字 1,但 bigint 将使用 8 个字节,而 tinyint 将使用 1 个字节。

    【讨论】:

      【解决方案3】:

      那些似乎是 MySQL 数据类型。

      根据他们采取的documentation

      1. tinyint = 1 个字节
      2. smallint = 2 个字节
      3. mediumint = 3 个字节
      4. int = 4 个字节
      5. bigint = 8 个字节

      当然,接受越来越大的数字范围。

      【讨论】:

        【解决方案4】:

        当涉及到这些数据类型的实际使用时,了解使用某些整数类型可能只是过度使用或未充分使用,这一点非常重要。例如,在表中为employeeCount 使用整数数据类型表示employee 可能是一种过度杀伤力,因为它支持从负20 亿到正20 亿或零到大约40 亿(无符号)的整数值范围。因此,即使您考虑美国最大的雇主之一,例如拥有大约 220 万员工的沃尔玛,使用整数数据类型作为employeeCount 列也是不必要的。在这种情况下,您可以使用 mediumint(支持从 0 到 1600 万(无符号))。话虽如此,如果预计您的范围非常大,您可能会考虑 bigint,正如您从 Daniel 的笔记中看到的那样,它支持的范围比我想破译的要大。

        【讨论】:

        • 在您的沃尔玛示例中,拥有 220 万活跃员工 - 我认为员工流动率每年约为 50%,EmployeeID 上的 INT 类型将是最低要求。大家怎么看?授予 - 对于大多数普通公司来说,INT 类型将是矫枉过正!
        【解决方案5】:

        区别在于分配给每个整数的内存量,以及每个整数可以存储多大的数字。

        【讨论】:

          【解决方案6】:

          数据类型范围存储

          bigint  -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)    8 Bytes
          int -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647)    4 Bytes
          smallint    -2^15 (-32,768) to 2^15-1 (32,767)  2 Bytes
          tinyint 0 to 255    1 Byte
          

          示例

          以下示例使用 bigint、int、smallint 和 tinyint 数据类型创建表。值被插入每列并在 SELECT 语句中返回。

          CREATE TABLE dbo.MyTable
          (
            MyBigIntColumn bigint
           ,MyIntColumn  int
           ,MySmallIntColumn smallint
           ,MyTinyIntColumn tinyint
          );
          
          GO
          
          INSERT INTO dbo.MyTable VALUES (9223372036854775807, 214483647,32767,255);
           GO
          SELECT MyBigIntColumn, MyIntColumn, MySmallIntColumn, MyTinyIntColumn
          FROM dbo.MyTable;
          

          【讨论】:

            猜你喜欢
            • 2012-07-26
            • 2011-02-15
            • 2010-09-22
            • 2011-08-20
            • 2012-04-21
            • 2013-01-18
            • 1970-01-01
            • 1970-01-01
            • 2010-10-15
            相关资源
            最近更新 更多