数据库 int,char 字段后面的长度是什么
先上结论:
int 字段的长度与你存储的数据长度 无关
,与显示有关
char 字段的长度与你存储数据长度 有关
int 字段长度
先介绍 int,首先看下面的这张表
CREATE TABLE `test10` (`id` int(10) NOT NULL AUTO_INCREMENT,
`num1` int(3) DEFAULT NULL,
`num2` int(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
新手:num1 字段,能存储最大长度为 3 的整形
不好意思错了
,int 类型的存储大小为 4 个字节,一个字节 8 位,也就是 2^32。int 的取值范围(-2147483648 ~ 2147483647),最大能表示长度为 10 的数
在数据库中的 int 不管后面填的长度为多少,只要在 int 的取值范围内,都能够将你的存储的数正常放入。这就引来疑问了,那设置长度的意义是什么呢。
来看看官网的解释
“MySQL 还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。“
这是官网的解释,意思就是位数不满足时,自动补充 0,但不影响存储。
实践是检验真理的唯一标准。
insert into test10 (num1,num2) values('1','10');
看结果
select * from test10
+----+------+------+
| id | num1 | num2 |
+----+------+------+
| 3 | 1 | 10 |
+----+------+------+
1 row in set (0.01 sec)
发现并没有对我们刚刚插入的数据进行补齐,根据 num1(3),num(6), 按理说 num1=001,num2=000010。
网上查了一下,知道原来是 zerofill 这个属性,没有加上
CREATE TABLE `test10` (`id` int(10) NOT NULL AUTO_INCREMENT,
`num1` int(3) DEFAULT NULL, #少了 zerofill 属性
`num2` int(6) DEFAULT NULL, #少了 zerofill 属性
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
修改之后
`test10` (`id` int(10) NOT NULL AUTO_INCREMENT,
`num1` int(3) unsigned zerofill DEFAULT NULL,
`num2` int(6) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
查询
select * from test10;
+----+------+--------+
| id | num1 | num2 |
+----+------+--------+
| 3 | 001 | 000010 |
+----+------+--------+
1 row in set (0.01 sec)
补齐成功。
这下算是真正了解了 int 字段长度的含义了!
char 字段长度
接着介绍 char,看下面这张表
CREATE TABLE `test20` (`id` int(10) NOT NULL AUTO_INCREMENT,
`char1` char(3) DEFAULT NULL,
`char2` char(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
这时新手又会说了:既然 int 字段的长度不影响存储数据的大小,那么 char 也应该一样了。不好意思又错了
,char 的取值范围为 1~255 个字节,每个汉字 3 个字节。
不管如何咱们先来按先前的操作来试验一遍好了
insert into test20 (char1,char2) values ('abcd','abcd');
看结果
select * from test20;
+----+-------+-------+
| id | char1 | char2 |
+----+-------+-------+
| 4 | a | b |
+----+-------+-------+
1 row in set (0.01 sec)
可以发现我们插入小于定义的长度,可以正常插入并且显示出来。那么插入比定义的长度大,会发生什么呢,让我们来试一试。
insert into test20 (char1,char2) values ('abcd','abcd');
ERROR 1406 (22001): Data too long for column 'char1' at row 1
可以看到,char1 插入的‘abcd’,比我们定义的数据要长,所以报错了。
有一点要提的是,char(6)如果你只存了‘abc’这样 3 位数据,它所占的存储空间还是 6 位的,多出来的三位会设置为空字符,这和 varchar 是有区别的。
那么就可以得出结论了,char 定义的字段长度,是和要存储的数据长度有关系的。
如果要想了解一下各个字段类型的说明可以看下字段数据类型
正好碰到 zerofill 这个属性,那么就学习一下
zerofill 属性的作用
1、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的 0
2、zerofill 默认为 int(10)
3、当使用 zerofill 时,默认会自动加 unsigned(无符号)属性,使用 unsigned 属性后,数值范围是原值的 2 倍,例如,有符号为 -128~+127,无符号为 0~256。