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

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

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

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

以下是SQL Server的大小和值范围 ,其他RDBMS具有相似的文档:

  • MySQL的
  • Postgres的
  • 甲骨文 (他们只有一个NUMBER数据types)
  • DB2

原来,他们都使用相同的规范(有一些小的例外,下面注明),但支持这些types的各种组合(Oracle不包括,因为它只有一个NUMBER数据types,请参阅上面的链接):

  SQL Server MySQL Postgres DB2 tinyint XX smallint XXXX mediumint X int / integer XXXX bigint XXXX 

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

  • tinyint1个字节 ,-128到+127 / 0到255(无符号)
  • smallint2个字节 ,-32,768到+32,767 / 0到65,535(无符号)
  • mediumint3字节 ,-8,388,608至8,388,607 / 0至16,777,215(无符号)
  • int / integer4字节 ,-2,147,483,648至+2,147,483,647 / 0至4,294,967,295(无符号)
  • bigint8字节 ,-9,223,372,036,854,775,808至9,223,372,036,854,775,807 / 0至18,446,744,073,709,551,615(无符号)

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

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

在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个字节

那些似乎是MySQL数据types。

根据他们的文件 :

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

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

当它到达这些数据types的真实世界的使用时,了解使用某些整数types可能只是一个矫枉过正的或未被使用的是非常重要的。 例如,在表中使用employeeCount的整数数据types说雇员可能是一个矫枉过正的,因为它支持从大约20亿到20亿的整数值或从零到大约40亿(无符号)的整数值范围。 所以,即使你考虑像沃尔玛这样的美国最大的雇主,约有220万雇员使用一个整数数据types的employeeCount列是不必要的。 在这种情况下,您可以使用mediumint(支持0到1600万(无符号))。 话虽如此,如果您的范围预计会exception大,您可以考虑从Daniel的笔记中可以看出bigint支持的范围大于我关心的解码范围。

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

数据types范围存储

 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数据types创build一个表。 将值插入到每个列中,并在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;