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


368

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

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

Answers:


574

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

这是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中可用,其余类型仅使用有符号范围,但有一个值得注意的例外:tinyint在SQL Server中为无符号,其值范围为0到255。


21
我不知道无符号类型仅在MySQL中可用,这是MySQL与其他RDBMS相比的巨大优势。自该答案发布之日起有什么变化?
biox

3
@Daniel,他们在想什么,为什么3个字节只有一个字节,而6个字节却没有字节?
Pacerier,2014年

9
@Pacerier可能他们不知道该如何命名:))
Mihai Matei 2015年

5
他们应该已经被称为 bigint并代替BIGINT,一个humongousint。
MarioDS '16

5
作为美国的甲骨文公司,greatint是一个选择。:)
osiris

32

所需存储空间的大小以及数量可以多大

在SQL Server上

tinyint 1个字节,0到255

smallint 2个字节,-2 ^ 15(-32,768)至2 ^ 15-1(32,767)

int 4个字节,-2 ^ 31(-2,147,483,648)到2 ^ 31-1(2,147,483,647)

bigint 8字节,-2 ^ 63(-9,223,372,036,854,775,808)至2 ^ 63-1(9,223,372,036,854,775,807)

您可以将数字1总共存储4,但是bigint将使用8个字节,而tinyint将使用1个字节


15

这些似乎是MySQL数据类型。

根据文档,他们采取:

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

并且自然会接受越来越大的数字范围。


9

当涉及到这些数据类型在现实世界中的用法时,非常重要的一点是要了解使用某些整数类型可能是一种过度使用或使用不足的情况。例如,在表中对employeeCount使用整数数据类型表示,employee可能是一个过大的杀手,因为它支持从负20亿到正20亿或从零到大约40亿(无符号)的整数值。因此,即使您考虑了美国最大的雇主之一,例如沃尔玛(Walmart),大约有220万名员工,也没有必要为employeeCount列使用整数数据类型。在这种情况下,您可以使用mediumint(支持0到1600万(无符号))。话虽如此,但如果您的范围预计会异常大,则可以考虑从Daniel's中看到的bigint


2
以沃尔玛拥有220万活跃员工的示例为例,我认为在员工流动率每年约为50%的情况下,EmployeeID上的INT类型将是最低要求。你们怎么想 理所当然-对于大多数普通公司而言,INT类型可能会过分杀人!
kiltannen


2

数据类型范围存储

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.