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

419

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

在哪些情况下应该使用它们?

6个回答

643

它们占用的空间不同,可接受值的范围也不同。

这里是SQL Server大小和值范围的信息,其他关系型数据库系统有类似的文档:

事实证明,它们都使用相同的规范(以下仅有一些小例外),但支持各种类型的组合(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 

“unsigned”类型只在MySQL中可用,而其他数据库使用带符号的范围,但有一个明显的例外:SQL Server中的tinyint是无符号的,其值范围为0到255。


26
我不知道无符号类型仅在MySQL中可用,这是MySQL相对于其他关系型数据库管理系统的巨大优势。自发布该回答以来有任何变化吗? - biox
4
@Daniel,他们在想什么,为什么有一个针对3字节的,但没有6字节的? - Pacerier
11
@Pacerier 可能他们不知道该怎么命名它 :)) - Mihai Matei
5
他们本应该把那个称作大整型,而将原来的大整型称作巨型整型。 - MarioDS
6
伟成科技可能是一个选择,毕竟Oracle是一家美国公司。 :) - osiris
显示剩余4条评论

42
所需的存储空间大小和数字的大小。
在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)
你可以在这4个数据类型中存储数字1,但是`bigint`将使用8字节,而`tinyint`将使用1字节。

21

这些似乎是 MySQL 数据类型。

根据文档,它们分别占用:

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

当然,它们也能接受越来越大的数字范围。


12

在实际应用这些数据类型时,理解使用特定的整数类型可能会过度或者未被利用是非常重要的。例如,在一个名为员工的表中使用整数数据类型表示员工数量可能会是一种浪费,因为它支持从负20亿到正20亿或0到约40亿(无符号)之间的整数值范围。因此,即使考虑到像沃尔玛这样美国最大的雇主之一,拥有大约220万名员工,对于员工数列使用整数数据类型也是不必要的。在这种情况下,例如使用mediumint(支持从0到1600万(无符号)之间的值)。话虽如此,如果您的范围预计非常大,您可以考虑bigint,正如您可以从丹尼尔的笔记中看到,它支持比我想象的范围更大。


6
在你提到沃尔玛有220万在职员工的例子中,考虑到员工每年大约50%的离职率,我认为需要使用INT类型的EmployeeID作为最低限制。大多数情况下,对于普通公司来说,使用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;

2

两者区别在于分配给每个整数的内存数量以及它们各自可以存储的数字大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接