我的sql中"int"和"int(2)"数据类型的区别

A.C*_*aji 37 mysql

我想知道为什么我的sql数据类型给出了范围.我定义了一个字段名为"id"的表,数据类型为"int(2)".我将值"id"插入"123456".这是接受并存储的.那么给出范围有什么用呢?

提前致谢.

Whi*_*g34 46

对于INT属性的其他数字类型,仅指定显示宽度.

请参阅MySQL文档中的数字类型属性:

MySQL支持扩展,可以选择在类型的base关键字后面的括号中指定整数数据类型的显示宽度.例如,INT(4)指定显示宽度为四位的INT.应用程序可以使用此可选显示宽度来显示宽度小于为列指定的宽度的整数值,方法是用空格填充它们.(也就是说,此宽度存在于使用结果集返回的元数据中.是否使用它取决于应用程序.)

显示宽度不会限制可以存储在列中的值的范围.它也不会阻止比列显示宽度更宽的值正确显示.例如,指定为SMALLINT(3)的列的通常SMALLINT范围为-32768到32767,超出三位数允许的范围之外的值将使用三位数以上的方式完整显示.

  • 但是对于“ varchar”和“ char”类型,它仅意味着范围,而不仅仅是显示宽度? (2认同)
  • 是的,对于“ VARCHAR”和“ CHAR”,它指定了长度。对于`DECIMAL`,它实际上会影响小数点前后的精度。它并不总是使用相同的。 (2认同)

Jon*_*ack 17

可选的显示宽度说明符(对于整数数据类型)仅在使用zerofill时适用,并且与整数数据类型的内部大小(以字节为单位)无关.

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

drop table if exists foo;
create table foo
(
bar smallint(4) unsigned zerofill not null default 0
)engine=innodb;

insert into foo (bar) values (781),(727);

select * from foo;
+-----------+
| bar       |
+-----------+
|      0781 |
|      0727 |
+-----------+
Run Code Online (Sandbox Code Playgroud)

更重要的是,您应该考虑的是整数数据类型是应该签名还是未签名,例如

create table users
(
user_id int not null auto_increment primary key, -- -2147483648 to 2147483647
...
)engine=innodb;
Run Code Online (Sandbox Code Playgroud)

create table users
(
user_id int unsigned not null auto_increment primary key, -- 0 to 4294967295
...
)engine=innodb;
Run Code Online (Sandbox Code Playgroud)

那么,它是 - 未签名或签名?

希望这可以帮助 :)


Cia*_*ing 8

(2)没有定义整数的大小.它只是在某些工具中显示的位数 - 我不确定细节.整数的大小由INT,TINYINT,SMALLINT,MEDIUMINT或BIGINT决定.