困惑
数据说话
32位操作系统int类型的最大值是 2147483647。在32位操作系统下int类型取值范围如下:1、Int32 //等于int,占4个字节(-2147483648~2147483647)。2、Int8 //等于byte,3、Int16 //等于short,占2个字节(-
我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295,将近40亿,难道用了int(1),就不能达到这个最大值吗?
CREATE TABLE `user` (`id` int(1) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;复制代码
int的最大值为32767.2 对于32位和64位编译器,int占32位(4字节)。int的最大值为2147483647 3 可以通过打印sizeof(int)查看平台对应的int占用字节数。乘8后即为位数。最高位为符号位,如位数为n,则最大值为 2^(n。
id字段为无符号的int(1),我来插入一个最大值看看。
int最大值,根据编译器类型不同而变化,具体如下:1、对于16位编译器,int占16位(2字节)。int的最大值为32767.2、对于32位和64位编译器,int占32位(4字节)。int的最大值为2147483647 3、可以通过打印sizeof(int)查。
可以看到成功了,说明int后面的数字,不影响int本身支持的大小,int(1)、int(2)...int(10)没什么区别。
零填充
一般int后面的数字,配合zerofill一起使用才有效。先看个例子:
0】,最大值为【255】。例如:采用char类型,用一个字节表示非负整数,最小值为0,最大值不能为128。char类型表示范围:-128~shu127 unsigned char类型表示范围:0~255。---使用这种类型,就可以了。
CREATE TABLE `user` (`id` int(4) unsigned zerofill NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;复制代码
注意int(4)后面加了个zerofill,我们先来插入4条数据。
mysql> INSERT INTO `user` (`id`) VALUES (1),(10),(100),(1000);Query OK,4 rows affected (0.00 sec)Records: 4Duplicates: 0Warnings: 0复制代码
2147483647 即为32位int类型最大值。C语言中最大的整型数据类型是long类型,占4个字节 C中短整型和整型均占2个字节,取值范围是 -32768 ~~~ 32767 长整型占4个字节,取值范围是 -2147483648 ~~~ 2147483647 如果是无符。
分别插入1、10、100、1000 4条数据,然后我们来查询下:
通过数据可以发现 int(4) + zerofill实现了不足4位补0的现象,单单int(4)是没有用的。 而且对于0001这种,底层存储的还是1,只是在展示的会补0。
总结
int类型能存储的最大数值是2^32 int类型在内存中占4个字节,也就是用32位二进制表示。其中最高位为符号位,0表示正,1表示负。int类型正数上限二进制表示为0111 1111 1111 1111即(2^32)-1,表示0的符号位是0(即最。
int后面的数字不能表示字段的长度,int(num)一般加上zerofill,才有效果。zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 ... 999这种,如果mysql没有零填充的功能,但是你又要格式化输出等长的数字编号时,那么你只能自己处理了。