ChatGPT解决这个技术问题 Extra ChatGPT

MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别?

MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别?

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


C
Community

它们占用不同数量的空间,并且具有不同的可接受值范围。

Here are the sizes and ranges of values for SQL Server,其他 RDBMS 也有类似的文档:

MySQL

Postgres

Oracle(他们真的只有一个 NUMBER 数据类型)

DB2

事实证明,它们都使用相同的规范(下面提到了一些小例外),但支持这些类型的各种组合(不包括 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


我不知道无符号类型仅在 MySQL 中可用,这是 MySQL 相对于其他 RDBMS 的巨大优势。自发布此答案之日起,有什么变化吗?
@Daniel,他们在想什么,为什么 3 个字节有一个,而 6 个字节没有一个?
@Pacerier 可能他们不知道如何命名它:))
他们应该称它为 bigint 而不是 bigint,而是一个humonousint。
Greatint 可能是一种选择,因为甲骨文是一家美国公司。 :)
i
informatik01

所需的存储大小以及数量可以有多大。

在 SQL Server 上:

tinyint 1 字节,0 到 255

smallint 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)

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


i
informatik01

这些似乎是 MySQL 数据类型。

根据他们采取的documentation

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

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


A
Anil M

当涉及到这些数据类型的实际使用时,了解使用某些整数类型可能只是过度使用或未充分使用,这一点非常重要。例如,在表中为employeeCount 使用整数数据类型表示employee 可能是一种过度杀伤力,因为它支持从负20 亿到正20 亿或零到大约40 亿(无符号)的整数值范围。因此,即使您考虑美国最大的雇主之一,例如拥有大约 220 万员工的沃尔玛,使用整数数据类型作为employeeCount 列也是不必要的。在这种情况下,您可以使用 mediumint(支持从 0 到 1600 万(无符号))。话虽如此,如果您的范围预计会异常大,您可能会考虑 bigint ,正如您从 Daniel 的笔记中看到的那样,它支持的范围比我想破译的要大。


在您的沃尔玛示例中,拥有 220 万活跃员工 - 我认为员工流动率每年约为 50%,因此 EmployeeID 上的 INT 类型将是最低要求。大家怎么看?授予 - 对于大多数普通公司来说,INT 类型将是过度杀伤力!
A
Alexsander Akers

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


R
Raviteja

数据类型范围存储

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;