int(11)和int(11) UNSIGNED有什么区别?

52

int(11)int(11) UNSIGNED 有什么区别?

8个回答

95

UNSIGNED类型不能为负数,但从另一方面来说,它对于正整数的范围是有两倍大的。TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT这些类型都有带符号和无符号版本。

对于INT类型,其范围定义如下:

Type          Storage         Min           Max
INT                 4 -2147483648    2147483647
INT UNSIGNED        4           0    4294967295

有符号和无符号类型占用相同的存储空间(INT为4个字节)。

更多详细信息请参阅文档


29

INT的取值范围是从-2147483648+2147483647
UNSIGNED INT的取值范围是从04294967295

花括号中的11对数字本身没有影响,只是影响了它的显示方式。


5
顺便提一下,如果使用 ZEROFILL,数字 11 只会影响“显示”的整数宽度,否则它没有明显的影响。 - New Guy
什么是 ZEROFILL ?不是所有的整数都默认为零吗?int(11) 不也限制它只有 11 个字符吗? - Ben
2
@Webnet:不,(11)与存储空间或范围无关。这由类型(INT、SMALLINT、BIGINT等)定义。如果您没有使用ZEROFILL,可以省略它。 - Mark Byers
5
ZEROFILL 表示如果一个数字的长度小于指定的位数,它将在左边填充足够多的零以达到该限制。 - Matteo Riva

7

UNSIGNED表示它只能存储非负值,即它不能存储例如-20


6
如果您将无符号属性添加到数据类型中,它可以存储更大范围的正数。 - JamesHalsall
@Jaitsu:是的,范围会发生移位,因此对于无符号数来说最大的适合值将会扩大一倍。 - Armen Tsirunyan

4

UNSIGNED 就是不带符号的正数。字节大小相同,但如果你的数据永远不会为负数,你可以获得更大的正数。11 是默认获取和显示的字符数。对于精确的大小,请搜索您正在使用的 DBMS 和类型。


3

所有整数类型都可以有一个可选(非标准)的 UNSIGNED 属性。无符号类型可用于在列中仅允许非负数或当您需要更大的数字范围时使用该列。例如,如果 INT 列是 UNSIGNED,则该列的范围大小相同,但其端点从 -2147483648 和 2147483647 移动到 0 和 4294967295。

请参阅这里:http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html


2
无符号整数不能存储负数。

1

我想你可能想知道int和int(10)之间的区别。

我们来举一个带有zerofill关键字和不带的int(10)的例子,表格如下:

create table tb_test_int_type(
    int_10 int(10),
    int_10_with_zf int(10) zerofill,
    unit int unsigned
);

让我们插入一些数据:


insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647) 
;

然后。
select * from tb_test_int_type; 

# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'

我们可以看到:
  • 使用关键字zerofill,当数字小于10时会填充0,否则不会。

  • 其次,使用关键字zerofill,int_10_with_zf变成了无符号整型,如果插入负数会出现错误Out of range value for column.....。但是你可以向int_10插入负数。另外,如果你向int_10插入4294967291,也会出现错误Out of range value for column.....

结论:
  1. 没有关键字zerofill的int(X)等同于int范围-2147483648~2147483647

  2. 有关键字zerofill的int(X)字段等同于无符号整型范围0~4294967295,如果数字长度小于X,它将在左侧填充0


1

无符号整数可以处理从0到2^(整数字段位数)的值。有符号整数可以处理从-2^(整数字段位数-1)到2^(整数字段位数-1)-1的值。


1
这是不正确的。请参考Tyilo的答案获取正确的数字。 - tuomassalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接