学习tinyint的参数并验证字节与范围的关系
新建一个表
mysql> use test;
mysql> create table jack(
mysql> id int primary key auto_increment,
mysql> sname varchar(30) not null default '',
mysql> age tinyint not null default 0
mysql> )engine myisam charset utf8;
mysql> desc jack; ---查看表
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(30) | NO | | | |
| age | tinyint(4) | NO | | 0 | |
+-------+-------------+------+-----+---------+----------------+
mysql> insert into jack
-> (sname,age)
-> values
-> ('刘备',30),('张飞',34),('关羽',20),('曹操',-45),('马云',55),('小二',-129),('小三',128);
mysql> select * from jack;
+----+--------+-----+
| id | sname | age |
+----+--------+-----+
| 1 | 刘备 | 30 |
| 2 | 张飞 | 34 |
| 3 | 关羽 | 20 |
| 4 | 曹操 | 45 |
| 5 | 马云 | 55 |
| 6 | 小二 |-128|
| 7 |小三 | 127 |
+----+--------+-----+
从上面我们发现,小二是-129,小三是128,可是在查看结果时却显示的是-128和127,这是因为tinyint类型有符号的范围是-128,127
下面我们再增加一行,将tinyint类型定义为无符号
mysql> alter table jack add score tinyint unsigned not null default 0; ----增加一列score tinyint符号类型为unsiged(无符号)
mysql> insert into jack (sname,age,score) values ('吕布',19,256),('孙权',50,-1);
mysql> select * from jack;
+----+--------+------+-------+
| id | sname | age | score |
+----+--------+------+-------+
| 1 | 刘备 | 30 | 0 |
| 2 | 张飞 | 34 | 0 |
| 3 | 关羽 | 20 | 0 |
| 4 | 曹操 | 45 | 0 |
| 5 | 马云 | 55 | 0 |
| 6 | 小二 | -128 | 0 |
| 7 | 小三 | 127 | 0 |
| 8 | 吕布 | 19 | 255 |
| 9 | 孙权 | 50 | 0 |
+----+--------+------+-------+
从上面我们发现,吕布score是256,孙权是-1,可查看执行的结果却是255,0,这是因为加了unsigned(无符号),所以tinyint无符号的范围是0,255
查看下此表的数据类型
mysql> desc jack;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(30) | NO | | | |
| age | tinyint(4) | NO | | 0 | |
| score | tinyint(3) unsigned | NO | | 0 | |
+-------+---------------------+------+-----+---------+----------------+
所以如果不想数值为负,在所有类型后加unsigned
总结:所有*int类型不加特殊说明,默认是有符号,加unsigned表示无符号,可以影响存储的范围
分析M参数
例:注:这里的M就是tinyint(1)里的1
mysql> alter table jack add age1 tinyint(1)not null default 0;
mysql> insert into jack (sname,age1) values ('M的意思',3);
mysql> insert into jack (sname,age1) values ('再看M的意思',99);
mysql> select * from jack;
+----+------------------+------+-------+------+
| id | sname | age | score | age1 |
+----+------------------+------+-------+------+
| 1 | 刘备 | 30 | 0 | 0 |
| 2 | 张飞 | 34 | 0 | 0 |
| 3 | 关羽 | 20 | 0 | 0 |
| 4 | 曹操 | 45 | 0 | 0 |
| 5 | 马云 | 55 | 0 | 0 |
| 6 | 小二 | -128 | 0 | 0 |
| 7 | 小三 | 127 | 0 | 0 |
| 8 | 吕布 | 19 | 255 | 0 |
| 9 | 孙权 | 50 | 0 | 0 |
| 10 | M的意思 | 0 | 0 | 3 |
| 11 | 再看M的意思 | 0 | 0 | 99 |
+----+------------------+------+-------+------+
从上面我们发现定义的M为1并不是指宽度(代表一个字符)因为我们写两个字符也能录入,要想使M有意义,即M等于多少就代表多少个字符,必须要配合zerofill使用
zerofill zero是零 fill是填充,代表0填充
M必须和zerofill配合才有意义
下面再给学员表增加一个学号列
mysql> alter table jack add snum smallint(5) zerofill not null default 0;
mysql> insert into jack (sname,snum) values ('小胡',3456),('小情',123);
mysql> select * from jack;
+----+--------+-----+-------+------+-------+
| id | sname | age | score | age1 | snum |
+----+--------+-----+-------+------+-------+
| 17 | 小情 | 0 | 0 | 0 | 00123 |
| 18 | 小胡 | 0 | 0 | 0 | 03456 |
+----+--------+-----+-------+------+-------+
mysql> desc jack;
+-------+-------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(30) | NO | | | |
| age | tinyint(4) | NO | | 0 | |
| score | tinyint(3) unsigned | NO | | 0 | |
| age1 | tinyint(1) | NO | | 0 | |
| snum | smallint(5) unsigned zerofill | NO | | 00000 | |
+-------+-------------------------------+------+-----+---------+----------------+
注意:学号不能为负 学号一般倍数相同,即使不同,也得用0填充,即不够倍数,用0填充
sum统一补0,而且补到5位,因为M为5
总结M表示补0宽度,和zerofill配合使用才有意思
观察snum多了个unsigned
因为zerofill则同时必是unsigned类型