先上结论:
int字段的长度与你存储的数据长度无关
,与显示有关
char字段的长度与你存储数据长度有关
数据库
先介绍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的整形.net
很差意思错了
,int类型的存储大小为4个字节,一个字节8位,也就是2^32 。 int的取值范围(-2147483648 ~ 2147483647),最大能表示长度为10的数code
在数据库中的int无论后面填的长度为多少,只要在int的取值范围内,都可以将你的存储的数正常放入。这就引来疑问了,那设置长度的意义是什么呢。blog
来看看官网的解释get
“MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制能够在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。“
这是官网的解释,意思就是位数不知足时,自动补充0,但不影响存储。test
实践是检验真理的惟一标准。select
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。im
网上查了一下,知道原来是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 ,看下面这张表
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属性的做用
一、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0二、zerofill默认为int(10)三、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128~+127,无符号为0~256。