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

Posted

技术标签:

【中文标题】MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有啥区别?【英文标题】: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 有什么区别?

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

【问题讨论】:

【参考方案1】:

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

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

MySQL Postgres Oracle(他们真的只有 NUMBER 数据类型) DB2

事实证明,它们都使用相同的规范(下面提到了一些小例外),但支持这些类型的各种组合(不包括 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:

    tinyint = 1 个字节 smallint = 2 个字节 mediumint = 3 个字节 int = 4 个字节 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;

【讨论】:

以上是关于MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

mysql bigint ,int , smallint,tinyint 的范围

MySQL数据库中int,bigint,smallint和tinyint区别

单个数字的 Mysql 数据类型 - tinyint(1) 或 smallint(1) 或 int(1)

MYSQL 字段类型之TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT

Tinyint(byte),SmallInt(Int16) 与 EF5 中的 Enum 不兼容

mysql-数据类型