我想知道为什么范围是用我的sql数据类型给出的。我定义了一个字段名为“id”的表,数据类型为“int(2)”。我将值“id”插入“123456”。这是接受并存储的。那么给出范围有什么用呢。
提前致谢。
答案 0 :(得分:45)
对于INT
和其他数字类型,该属性仅指定显示宽度。
请参阅MySQL文档中的Numeric Type Attributes:
MySQL支持扩展名 可选择指定显示 中的整数数据类型的宽度 base关键字后面的括号 对于类型。例如,INT(4) 指定具有显示宽度的INT 四位数。这个可选的显示 应用程序可以使用宽度 显示具有宽度的整数值 小于指定的宽度 用左边填充它们的列 空间。 (也就是说,这个宽度是 存在于返回的元数据中 结果集。是否使用 取决于申请。)
显示宽度不受约束 可以存储的值范围 在专栏中。它也没有阻止 值比列显示宽 正确显示宽度。 例如,指定为的列 SMALLINT(3)具有通常的SMALLINT 范围-32768到32767,以及值 超出三个允许的范围 数字全部显示使用 超过三位数。
答案 1 :(得分:15)
可选的显示宽度说明符(对于整数数据类型)仅在使用 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 |
+-----------+
更重要的是,您应该考虑的是整数数据类型是否应该是有符号或无符号的。例如
create table users
(
user_id int not null auto_increment primary key, -- -2147483648 to 2147483647
...
)engine=innodb;
VS
create table users
(
user_id int unsigned not null auto_increment primary key, -- 0 to 4294967295
...
)engine=innodb;
那么,它是 - 无符号或签名??
希望这会有所帮助:)
答案 2 :(得分:8)
(2)没有定义整数的大小。它只是在某些工具中显示的位数 - 我不确定细节。整数的大小取决于它是INT,TINYINT,SMALLINT,MEDIUMINT还是BIGINT。
答案 3 :(得分:0)
据我所知,当您定义INT(2)
(其中最大值为4)时,您在内存中分配2位,但如果您插入的值更大,那么4,MySQL将请求更多来自系统的记忆。
所以INT(2)
意味着分配至少2位用于存储该值,如果值更大,则指定(INT(2)
),DBMS将再次请求存储器请求此存储器。 这对于请求内存两次的性能原因没有好处,这就是为什么更好地为列分配更多空间的原因。