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

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

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

389397 次浏览

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

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

下面是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

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

需要的存储空间大小有多大的数字可以是。

SQL Server:

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

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

这些似乎是MySQL数据类型。

根据文档他们采取:

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

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

在实际使用这些数据类型时,非常重要的一点是要理解使用某些整数类型可能会过度使用或使用不足。例如,在表中使用整数数据类型employeeCount表示employee可能会过度使用,因为它支持从~ - 20亿到正20亿或从0到大约40亿(无符号)的整数值范围。因此,即使您考虑到美国最大的雇主之一,例如拥有大约220万名员工的沃尔玛,也没有必要为employeeCount列使用整数数据类型。在这种情况下,您可以使用mediumint(它支持从0到1600万(无符号))。说了这么多,如果你的范围预计会非常大,你可能会考虑bigint,从丹尼尔的笔记中你可以看到,它支持的范围比我想破译的要大。

数据类型范围存储

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;