关闭

Mysql学习日记

标签: mysql
36人阅读 评论(0) 收藏 举报
分类:

今天在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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:80次
    • 积分:13
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档