这个问题是很久以前就发现的问题一直没有整理,今天有个朋友又问到这个问题。
先看一个mysql表结构
CREATE TABLE `test` (
`TYPEID` int(2)
) ENGINE=MyISAM CHARSET=latin1;
对于test表字段中的typeId 后面的 int(2)中的2代表的到底是什么含义。
对于大多数的人来说我们马上想到的是varchar(2)后面的2代表为两个字节,也就不难把int后的2误认为2位即typeId的最大存入的数为99【俺以前也一直这么认为的】 。
这样的想法一直延续的有个项目,对于数值类型只能在100内的字段忘记作校验就给插入数据库,测试的同事了把一个千位数插入,竟然插入并且数据库中数据也 正确。汗,当时我的第一反应是测试服务器的表创建错误,检查一遍没有啊。回到本地也测试了下发现也存在这个问题。逼的没办法了就上网上找资料,终于找到了 以下说明。
对于mysql的int来说它的长度是不变的及为4个字节、对于插入数据数据大小也是不变的。
带符号的数值大小范围为:-2147483648 到214748347
无符号的:0到4294967295
int(x)的x并不能改变int类型字段存入数据值的大小【即不能限制数值的范围】
举个示例说
int(2)能存入214748347。
int(1)也能存入214748347。
示例使用test表为例
insert into test value( 214748347);
发现能插入,整个过程如下:
int(2)能插入214748347。
那int(x)的x到底是什么,x为期望显示数据的列宽。
期望列宽干什么用,这个是和mysql的另外的关键字zerofill一起使用
zerofill 含义代表为未到达宽度x的前填充0【或称为0补位】,超出x代表宽度的数值按原样显示。
备注:zerofill自动将int标示为无符号的类型
无该关键代表不填充,按原值显示。
示例如下
CREATE TABLE `tZfill` (
`TYPEID` int(4) zerofill
) ENGINE=MyISAM CHARSET=latin1;
insert into tZfill value( 12 );
insert into tZfill value( 558585 );
select * from tZfill;
整个执行过程
mysql中的TINYINT、SMALLINT等数据类型都是这样表示。
(1): 这样可以看出mysql对于数值类型来说不管是多大的数它的存储大小没有改变【该占几个字节还是占几个字节,不因期望存储宽度即x而改变】,所以我们开发时候的选择合适的数值类型能用小的存储位数的就用小的。
(2):对于数字类型该校验的还是要校验,否则容易出现这样的问题.