Answers:
它们占用不同的空间量,并且具有不同的可接受值范围。
这是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。
所需存储空间的大小以及数量可以多大
在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个字节
当涉及到这些数据类型在现实世界中的用法时,非常重要的一点是要了解使用某些整数类型可能是一种过度使用或使用不足的情况。例如,在表中对employeeCount使用整数数据类型表示,employee可能是一个过大的杀手,因为它支持从负20亿到正20亿或从零到大约40亿(无符号)的整数值。因此,即使您考虑了美国最大的雇主之一,例如沃尔玛(Walmart),大约有220万名员工,也没有必要为employeeCount列使用整数数据类型。在这种情况下,您可以使用mediumint(支持0到1600万(无符号))。话虽如此,但如果您的范围预计会异常大,则可以考虑从Daniel's中看到的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;