Mysql学习日记

今天在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的作用】第一个就是,也是醉了。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值