[mysql基础文档]-7-数据类型之整型数
引言
在前面的建表过程中已经使用过整型数(int),但不恰当的整型数使用往往会带来不必要的磁盘空间浪费,这篇文章将介绍几种最常见的整型数。
文章目录
0×1.MySQL中常用的整型数介绍
盲目的使用int储存任何整数是非常不科学的,因为int值在数据库中使用4字节储存,4字节可以储存的无符号数字范围是0-2^32-1。
假设我们要储存一个人的年龄,现如今的科技能够证明的最高寿的人类也没有超过255岁,年龄字段如果使用int储存,就会出现磁盘空间的浪费。
下面是使用int储存年龄18的二进制展开:
00000000 00000000 00000000 00010010
四个字节只有最后一个字节被使用了,而前面三个字节,只有当一个人的年龄到达256岁的时候,才会使用到倒数第二个字节的最后一位,所以,这种int声明显得非常不合理(我们可以使用tinyint unsigned类型来储存年龄,因为tinyint类型仅占用一个字节,就目前,还没有人的年龄会超过255岁)。
下面是一些常用的int类型,占用字节由小到大:
tinyint:占用1字节,有符号取值范围-128~127,无符号(unsigned)取值范围0~255;
smallint:占用2字节,有符号取值范围-32768~32767,无符号取值范围0~65535;
mediumint:占用3字节,有符号-8388608~8388607,无符号0~16777215;
int:占用4字节,有符号-2147483648~2147483647,无符号0~4294967295;
bigint:占用8字节,有符号范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615;
0×2.有符号与无符号整型数
现在新建立一张表,假设这张表是用来储存某个年级学生名单和年龄的,这个年级不会超过1万人;参考本文第一部分的类型后,根据需求选择tinyint来储存年龄,使用smallint来储存每条记录的id(至于为什么要有一个id列,因为它可以作为主键,并且具有唯一性,便于检索,主键的概念后面的文章会详细介绍,这里暂且假设id列的数值从1递增且不重复),请看下面的实例:
--首先我们创建一个三列的表,第一列id,无符号smallint型,第二列name,固定长度10字符的字符型,第三列age,无符号tinyint型 --可能大家看今天的建表语法和以往不一样,以前语句都写在一行,其实可以将语句写在多行(仅仅是为了好看),回车可以进入下一行,只要不输入分号回车,语句就不会执行 mysql> create table t3 ( -> id smallint unsigned, -> name char(10), -> age tinyint unsigned -> ); --插入一条正常范围的记录 mysql> insert into t3 values(1,'qingsword',16); --插入一条age大于255的记录,提示"1 warning" mysql> insert into t3 values(2,'qingsword',256); Query OK, 1 row affected, 1 warning (0.01 sec) --查看数据表发现age并不是256,而是被设置成了tinyint unsigned类型可以接受的最大值255 mysql> select * from t3; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1 | qingsword | 16 | | 2 | qingsword | 255 | +------+-----------+------+ --同理,当插入的数值超过某列定义的最大值后,在写入数据库的时,不论这个插入的值有多大,MySQL都将自动转化成此列可以接受的最大值,并且给出一个错误提示 mysql> insert into t3 values(3,'qingsword',3000); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t3; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1 | qingsword | 16 | | 2 | qingsword | 255 | | 3 | qingsword | 255 | +------+-----------+------+ --注意!在部分数据库中,插入一个超出范围的值会返回一个错误,执行不成功。
P.s:在任何整数类型后面添加unsigned,都可以将他们声明成无符号类型(例如bigint unsigned);MySQL中能够使用的整型已经在第一部分全部列出,请根据不同需求选择。
0×3.使用Zerofill前端补零
有时候,需要在一些数字前补零显示,以达到固定长度,让显示更加的美观,比如学号,车牌,商品编号等。
假设有几个商品编号如下:
97
121
386
2
为了让显示美观,可能希望的输出是这样的:
00097
00121
00386
00002
这个时候就可以使用Zerofill属性了,请看下面的实例:
--新建表t5,包含一列SN,smallint类型,zerofill前端填充长度声明的方法是,将填充长度数字写在数据类型后面,包含在括号中,本例填充长度是5。 mysql> create table t4(SN smallint(5) zerofill); --查看表结构,发现上面创建表的时,并未添加unsigned属性,而Type中确包含了此属性,其实,这是因为zerofill是不能对负数前端填充的,MySQL自动加上了unsigned属性。 mysql> desc t4; +-------+-------------------------------+----+---+-------+-----+ | Field | Type |Null|Key|Default|Extra| +-------+-------------------------------+----+---+-------+-----+ | SN | smallint(5) unsigned zerofill |YES | | NULL | | +-------+-------------------------------+----+---+-------+-----+ --插入五条记录 mysql> insert into t4 values(97),(121),(368),(2),(12345); --除了最后一条记录,前面四条都自动补充了0,那么最后一条记录为什么没有补零呢,因为,zerofill指定的长度是需要将现有数字计算在内的,最后一个数字的长度刚好是5,所以就没必要再补零了。 mysql> select * from t4; +-------+ | SN | +-------+ | 00097 | | 00121 | | 00368 | | 00002 | | 12345 | +-------+