tinyint、smallint、mediumint、bigint和int在MySQL中有什么区别?
在哪些情况下应该使用它们?
它们占用的空间不同,可接受值的范围也不同。
这里是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。
这些似乎是 MySQL 数据类型。
根据文档,它们分别占用:
tinyint
= 1字节smallint
= 2字节mediumint
= 3字节int
= 4字节bigint
= 8字节当然,它们也能接受越来越大的数字范围。
在实际应用这些数据类型时,理解使用特定的整数类型可能会过度或者未被利用是非常重要的。例如,在一个名为员工的表中使用整数数据类型表示员工数量可能会是一种浪费,因为它支持从负20亿到正20亿或0到约40亿(无符号)之间的整数值范围。因此,即使考虑到像沃尔玛这样美国最大的雇主之一,拥有大约220万名员工,对于员工数列使用整数数据类型也是不必要的。在这种情况下,例如使用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;
两者区别在于分配给每个整数的内存数量以及它们各自可以存储的数字大小。