在MySQL中使用INT(1)和TINYINT(1)有区别吗?

ani*_*son 40 mysql types integer

我假设INT(1)与TINYINT(1)完全相同,但我真的不知道.每当我的值只能是一个整数(例如值0-9)时,我总是只使用INT(1)来表示它是一个整数而且它只是一个字符,我认为这意味着它只能是0到9的值(如果我错了,请向我解释).我总是忽略你可以将数字转换成其他类型的INT.我不懂MySQL,并且倾向于避免使用它可以做的更复杂的事情.

所以我的问题是,如果为每种类型定义长度为1,则各种整数类型INT,TINYINT,SMALLINT,MEDIUMINT和BIGINT之间是否存在任何差异;?如果没有,我是否应该使用它们(我可以看到使用它们以获得更多的语义含义,TINYINT比INT更具体)?如果是这样,我可以轻松地(和/或我应该)通过我的数据库并将我的所有INT(1)字段更改为TINYINT(1)字段吗?

Cod*_*ody 47

在这里,您将以更好的方式理解它!

tinyint: 1 byte, -128 to +127 / 0 to 255 (unsigned)
smallint: 2 bytes, -32,768 to +32,767 / 0 to 65,535 (unsigned)
mediumint: 3 bytes, -8,388,608 to 8,388,607 / 0 to 16,777,215 (unsigned)
int/integer: 4 bytes, -2,147,483,648 to +2,147,483,647 / 0 to 4,294,967,295 (unsigned)
bigint: 8 bytes, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 / 0 to 18,446,744,073,709,551,615 (unsigned)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是错误的,因为用户在定义大小时试图获得差异,这只是显示字段类型的范围 (8认同)
  • 谢谢,这超级好用! (3认同)
  • 这应该是选择的答案:)! (2认同)

Phi*_*hil 38

整数列类型的括号中的数字是"显示宽度".这不会影响存储要求,因为它们是预定义的.

进一步阅读

  • 因此,即使我将INT(1)定义为仅允许一个字符,它仍将使用4个字节,无论如何? (3认同)
  • @animuson `INT(1)` **not** 只允许一个字符。它设置结果集中该列的显示宽度。阅读上面的最后一个链接,它解释得很好 (3认同)
  • @animuson 这取决于总尺寸。如果它可以为您节省 1% 的空间,请不要管它。如果它为您节省了 20%,请考虑是否真的需要它。如果它为您节省了 50%,请进行更改。 (2认同)

Hol*_*ger 7

总结接受的答案:

括号中的数字表示*显示该字段的字符数*,**不是**该字段的存储大小。

但是如果你想知道存储大小,你应该查看MySQL源文档。

来源:MySQL 文档:整数类型(精确值) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT

直接引用源文档:

TINYINT:1 字节,-128 到 127 有符号,0 到 255 无符号

SMALLINT:2 个字节,-32768 到 32767 有符号,0 到 65535 无符号

MEDIUMINT:3 个字节,-8388608 到 8388607 有符号,0 到 16777215 无符号

INT:4 个字节,-2147483648 到 2147483647 有符号,0 到 4294967295 无符号

BIGINT : 8 字节,-2^63 到 2^63-1 有符号,0 到 2^64-1 无符号