今天在CSDN看到了一个笑话,是这么写的:程序猿的读书历程:x语言入门—>x语言应用实践—>x语言高阶编程—>x语言的科学与艺术—>编程之美—>编程之道—>编程之禅—>颈椎病康复指南。然后我默默看了看书架,任重而道远啊,感觉自己还要努力,争取早日读到劲椎病康复指南……
今天花时间复习了mysql的列数据类型,怎么说呢,感觉以前学习真是囫囵吞枣,很多细节都忽略了。重新复习一遍,收获挺多的。
先说说今天补上的第一个问题:关于整形数据后面小括号的问题,比如int(M),那么这个M是什么意思?我以前学习mysql,是一边坐着小项目,一边学习的,也没注意这个问题,今天突然有人问道这个问题。当时就想,不就是代表数据的宽度吗?结果在看燕十八老师的PHP视频的时候,才知道我的理解有误。
这里的M要配上一个zerofill属性才能够起作用,我用mysql进行了测试
-- 没有zerofill 的整型数据
create table human (
human_id int auto_increment primary key,
human_name varchar(20) not null default '',
human_num smallint(4) not null default 0
)engine = myisam charset = utf8;
-- human_num插入数据宽度一致 插入正常
insert into human (human_name,human_num) values ('张浩',1000);
Query OK, 1 row affected (0.00 sec)
-- 插入宽度不一致<M 插入正常
insert into human (human_name,human_num) values ('刘伟',10);
Query OK, 1 row affected (0.00 sec)
-- 插入宽度不一致>M 插入正常
insert into human (human_name,human_num) values ('王浩',10000);
Query OK, 1 row affected (0.00 sec)
那么在这里可以做一个小小的总结:这个宽度对普通数据无其它特殊作用,和不加宽度限制是一样的,那么它不是作为 字符宽度限制?
既然不是作为字符限制,有是不是作为字节限制呢?显然M也不是作为字节限制,如下
-- 测试2 将smallint(4) 替换成 smallint(1)
create table human (
human_id int auto_increment primary key,
human_name varchar(20) not null default '',
human_num smallint(1) not null default 0
)engine = myisam charset = utf8;
-- 插入
insert into human (human_name,human_num) values ('张浩',1000);
-- 插入正常 Query OK, 1 row affected (0.00 sec)
由此看出M也不是作为字节限制,因为如果是一个字节的话,一个字节8位,最大取值为255,1000超过了限制,如果作为字节限制的话,显然是插不进去的。
那么 它既不是字符宽度,也不是字节限制,它是干嘛的?
-- 测试3 含有zerofill 属性 的整型数据
-- 还是human 表
create table human (
human_id int auto_increment primary key,
human_name varchar(20) not null default '',
human_num smallint(4) zerofill not null default 0
)engine = myisam charset = utf8;
-- 插入数据
insert into human (human_name,human_num) values ('张浩',1000);
-- Query OK, 1 row affected (0.00 sec)
-- 插入正常 没什么变化
insert into human (human_name,human_num) values ('王浩',10000);
-- Query OK, 1 row affected (0.00 sec)
+----------+------------+-----------+
| human_id | human_name | human_num |
+----------+------------+-----------+
| 1 | 张浩 | 1000 |
| 2 | 王浩 | 10000 |
+----------+------------+-----------+
这时插入小于4字符宽度的数据时,再次查询
insert into human (human_name,human_num) values ('刘伟',10);
-- 再次查询数据库
+----------+------------+-----------+
| human_id | human_name | human_num |
+----------+------------+-----------+
| 1 | 张浩 | 1000 |
| 2 | 王浩 | 10000 |
| 3 | 刘伟 | 0010 |
+----------+------------+-----------+
可以看出human_id=3的行的human_num少于4的部分被 0 填充了,这就是M的作用,只有有了zerofill才能发挥神奇的作用。显然这个用法可以用于一些号码的自动生成 比如 某序列号 必须保证6位 ,设定了M=6,那么少于的6位的就能够自动完成了。
PS:百度 【mysql 数据类型后加一个数字的作用】时找了很长时间才找到正确的解释,换个方法百度 【mysql zerofill的作用】第一个就是,也是醉了。