学习tinyint的参数并验证字节与范围的关系

  1. 新建一个表

    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表示无符号,可以影响存储的范围

  2. 分析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类型