在 mysql 数据库的使用中,我们常常指定数据库表的字段的类型为整型int和可变字符串varchar,如下面一段 ddl (Data Definition Language)语法:

CREATE TABLE `test` ( `id` bigint NOT NULL AUTO_INCREMENT, `age` int(5) DEFAULT NULL, `age1` int DEFAULT NULL, `name` varchar(5) DEFAULT NULL, `name1` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

varchar(n)

针对varchar(n)很多人都知道,n是指字符串长度,我们先实验一下:

INSERT INTO `test`(`age`, `age1`, `name`, `name1`) VALUES (12345, 12345, 'ganhuojun', 'ganhuojun');

运行结果如下:

1406 - Data too long for column 'name' at row 1, Time: 0.001000s

可见数据长度过大,varchar(5)只能允许5个字符长度,修改下 sql 语句:

INSERT INTO `test`(`age`, `age1`, `name`, `name1`) VALUES (12345, 12345, 'ganhu', 'ganhuojun');

运行结果如下,说明降低了 name 字段的长度到5是可以成功存储的

Affected rows: 1, Time: 0.001000s

验证了varchar(n)中的n确实是指字符串长度

int(n)

在mysql数据库中,int占四个字节,一个字节 8 位,也就是 4 * 8 = 32,即2^32个数字。

那int(n)当中的n会不会和varchar(n)含义一样,下面将age字段输入123456来执行一下:

INSERT INTO `test`(`age`, `age1`, `name`, `name1`) VALUES (123456, 123456, 'ganhu', 'ganhuojun');

执行结果如下,发现竟然成功了,说明与varchar(n)含义不一样,并非限制数据长度。

Affected rows: 1, Time: 0.001000s

那么这个int(n)中的n到底是什么含义呢?

int(n) 中的n其实是指最大显示宽度,最大有效显示宽度是 255,且显示宽度与存储大小或类型包含的值的范围无关。

下面我们来验证一下,为了直观显示,使用ZEROFILL关键字,ZEROFILL的作用是插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0,重新定义一张表:

CREATE TABLE `test1` ( `id` bigint NOT NULL AUTO_INCREMENT, `age` int(5) ZEROFILL DEFAULT NULL, `age1` int ZEROFILL DEFAULT NULL, `name` varchar(5) DEFAULT NULL, `name1` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

此时,我们插入2组数据对比下结果:

INSERT INTO `test1`(`age`, `age1`, `name`, `name1`) VALUES (1, 123456, 'ganhu', 'ganhuojun'); INSERT INTO `test1`(`age`, `age1`, `name`, `name1`) VALUES (123456, 123456, 'ganhu', 'ganhuojun');

执行后结果如下图,看到1由于只有1个宽度,前面补充来4个0,达到了5位,而123456已经是6位了,显示正常。

int代表多少字符(你真的了解intn当中n的含义吗)(1)

此处验证了插入数据宽度小于定义n时,前面会用0补全,当超过定义的宽度n时,也能正常显示;注意int(n)并不会限制实际int的存储大小,依旧可以存4个字节的数据。

,