这个问题是很久以前就发现的问题一直没有整理,今天有个朋友又问到这个问题。
先看一个mysql表结构
- CREATE TABLE `test` (
- `TYPEID` int (2)
- ) ENGINE=MyISAM CHARSET=latin1;
对于test表字段中的typeId 后面的 int(2)中的2代表的到底是什么含义。
对于大多数的人来说我们马上想到的是varchar(2)后面的2代表为两个字节,也就不难把int后的2误认为2位即typeId的最大存入的数为99【俺以前也一直这么认为的】 。
对于mysql的int来说它的长度是不变的及为4个字节、对于插入数据数据大小也是不变的。
带符号的数值大小范围为:-2147483648 到214748347
无符号的:0到4294967295
int(x)的x并不能改变int类型字段存入数据值的大小【即不能限制数值的范围】
举个示例说
int(2)能存入214748347。
int(1)也能存入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):对于数字类型该校验的还是要校验,否则容易出现这样的问题.
补充:根据int类型允许存储的字节数是4个字节, 我们就能换算出int UNSIGNED(无符号)类型的能存储的最小值为0, 最大值为4294967295(即4B=32b, 最大值即为32个1组成);