龙空技术网

你真的了解int(n)当中n的含义吗

低调的干货君 181

前言:

目前同学们对“mysqlint占用多少个字节”大概比较着重,你们都想要了解一些“mysqlint占用多少个字节”的相关文章。那么小编在网络上网罗了一些有关“mysqlint占用多少个字节””的相关资讯,希望大家能喜欢,兄弟们一起来学习一下吧!

在 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位了,显示正常。

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

标签: #mysqlint占用多少个字节