MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有啥区别?
Posted
技术标签:
【中文标题】MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有啥区别?【英文标题】:What is the difference between tinyint, smallint, mediumint, bigint and int in MySQL?MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别? 【发布时间】:2011-02-28 19:16:13 【问题描述】:mysql 中的 tinyint、smallint、mediumint、bigint 和 int 有什么区别?
在什么情况下应该使用这些?
【问题讨论】:
【参考方案1】:它们占用不同数量的空间,并且具有不同的可接受值范围。
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 可能他们不知道如何命名它:)) 他们应该把 that 称为 bigint 而不是 bigint,而是一个 humongousint。 greatint 可能是一个选择,因为甲骨文是一家美国公司。 :)【参考方案2】:所需的存储大小以及有多大。
在 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)
您可以在所有 4 个中存储数字 1,但 bigint
将使用 8 个字节,而 tinyint
将使用 1 个字节。
【讨论】:
【参考方案3】:那些似乎是 MySQL 数据类型。
根据他们采取的documentation:
tinyint
= 1 个字节
smallint
= 2 个字节
mediumint
= 3 个字节
int
= 4 个字节
bigint
= 8 个字节
当然,接受越来越大的数字范围。
【讨论】:
【参考方案4】:当涉及到这些数据类型的实际使用时,了解使用某些整数类型可能只是过度使用或未充分使用,这一点非常重要。例如,在表中为employeeCount 使用整数数据类型表示employee 可能是一种过度杀伤力,因为它支持从负20 亿到正20 亿或零到大约40 亿(无符号)的整数值范围。因此,即使您考虑美国最大的雇主之一,例如拥有大约 220 万员工的沃尔玛,使用整数数据类型作为employeeCount 列也是不必要的。在这种情况下,您可以使用 mediumint(支持从 0 到 1600 万(无符号))。话虽如此,如果预计您的范围非常大,您可能会考虑 bigint,正如您从 Daniel 的笔记中看到的那样,它支持的范围比我想破译的要大。
【讨论】:
在您的沃尔玛示例中,拥有 220 万活跃员工 - 我认为员工流动率每年约为 50%,EmployeeID 上的 INT 类型将是最低要求。大家怎么看?授予 - 对于大多数普通公司来说,INT 类型将是矫枉过正!【参考方案5】:区别在于分配给每个整数的内存量,以及每个整数可以存储多大的数字。
【讨论】:
【参考方案6】:数据类型范围存储
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;
【讨论】:
以上是关于MySQL 中的 tinyint、smallint、mediumint、bigint 和 int 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
mysql bigint ,int , smallint,tinyint 的范围
MySQL数据库中int,bigint,smallint和tinyint区别
单个数字的 Mysql 数据类型 - tinyint(1) 或 smallint(1) 或 int(1)
MYSQL 字段类型之TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT