mysql中的int(4)-int(11)与int类型
前言
对于数据库,使用倒也不少,增删查改各种操作,但是没有认真学习过,只是会用,最近遇到一个情况才去研究了一个小问题。
新建一个表的时候:
CREATE TABLE test (
id int(11) NOT NULL AUTO_INCREMENT
)
之前一直有一个习惯的认知,觉得在建表中的int(#)就表示用#位的int型数据,有时会好奇为什么这么设置,但是也没研究过。这次是调试过程中,遇到了问题还以为程序性错误了,最后才发现是自己认知错误。
int(4)-int(11)-int类型
int类型
int类型的不用多少,常规的数据类型,4字节,无符号数范围0~4294967295,有符号数范围-2147483648~2147483647,
int(4)-int(11)
int后边的(#)内的数字#与int类型的数字范围无关,不会因为里边是11或者4,就表示11位或者4位的int型数据,这个#字只表示数字显示出来的宽度。数据显示的宽度有俩种情况:
- 如果没有在数据库设置0填充,那么其实不管设置显示的宽度为多少,显示就是数据库内的数据,不会在数据左侧自动填充0来补足显示的宽度;
- 设置了0填充,在查询结果时候显示出来的数据宽度不够设置的显示宽度时候,就会在数据左侧填充0直到达到设置的显示宽度,但是有一个问题就是设置了0填充,数据会自动变成unsigned类型的;如果数据宽大超过设置的显示宽度,也不会将数据只显示指定的显示宽度。
数据示例
以数据为例,假定有俩张表test、test1:
DROP TABLE IF EXISTS test;
CREATE TABLE test (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
password varchar(50) NOT NULL,
code int(4),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS test1;
CREATE TABLE test1 (
id int(11) unsigned zerofill NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
password varchar(50) NOT NULL,
code int(4) unsigned zerofill,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
分别在俩张表内插入相同的俩条数据:
123,tom,123456,123
12345,jack,123456,12345
然后在mysql命令行下查询数据:
实验分析与结论
从上图中可以看出来,同样数据类型,插入同样的数据,显示出来的结果:
- 123如果设置了0填充,则显示是会自动在左侧插入0,补足显示位宽,如int(11)的123为00000000123;没有设置零填充时,就是显示123
- 即便设置了显示的宽度,如果数据宽度超出了设置的显示宽度,如int(4)的12345,显示的时候并不会发生只显示1234或者2345的状况。