【发布时间】:2011-02-28 19:16:13
【问题描述】:
MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别?
在什么情况下应该使用这些?
【问题讨论】:
MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别?
在什么情况下应该使用这些?
【问题讨论】:
它们占用不同数量的空间,并且具有不同的可接受值范围。
Here are the sizes and ranges of values for 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 中可用,其余仅使用有符号范围,有一个值得注意的例外:SQL Server 中的tinyint 是无符号的,取值范围为 0到 255
【讨论】:
所需的存储大小以及有多大。
在 SQL Server 上:
tinyint1字节,0到255smallint 2 个字节,-215 (-32,768) 到 215-1 (32,767)int 4 个字节,-231 (-2,147,483,648) 到 231-1 (2,147,483,647)bigint 8 个字节,-263 (-9,223,372,036,854,775,808) 到 263-1 (9,223,372,036,854,775,807)您可以在所有 4 个中存储数字 1,但 bigint 将使用 8 个字节,而 tinyint 将使用 1 个字节。
【讨论】:
那些似乎是 MySQL 数据类型。
根据他们采取的documentation:
tinyint = 1 个字节smallint = 2 个字节mediumint = 3 个字节int = 4 个字节bigint = 8 个字节当然,接受越来越大的数字范围。
【讨论】:
当涉及到这些数据类型的实际使用时,了解使用某些整数类型可能只是过度使用或未充分使用,这一点非常重要。例如,在表中为employeeCount 使用整数数据类型表示employee 可能是一种过度杀伤力,因为它支持从负20 亿到正20 亿或零到大约40 亿(无符号)的整数值范围。因此,即使您考虑美国最大的雇主之一,例如拥有大约 220 万员工的沃尔玛,使用整数数据类型作为employeeCount 列也是不必要的。在这种情况下,您可以使用 mediumint(支持从 0 到 1600 万(无符号))。话虽如此,如果预计您的范围非常大,您可能会考虑 bigint,正如您从 Daniel 的笔记中看到的那样,它支持的范围比我想破译的要大。
【讨论】:
区别在于分配给每个整数的内存量,以及每个整数可以存储多大的数字。
【讨论】:
数据类型范围存储
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;
【讨论】: