目的:要学会建表
知识点:列类型
怎么建表?
以在A4纸上建表为例,学号,姓名,家乡,入学年份…
| 姓名 | 学号 | 家乡 | 入学年份 | 自我介绍 |
001 | 张三 | 01 | 湖北 | 2017 |
|
|
|
|
|
|
|
我们只要把第一行,表头建好,这张表也就完成了,至于下面的001,张三,这不是表的概念,而且表中存储的数据。其实建表过程,就是一个画表头的过程,从术语上讲,这张表有5个列。
建表的过程,就是一个声明字段过程。
那么建表和列类型又有什么关系呢?
再看上面的表,A4纸是数据的存储空间,而A4的大小是有限的,请问给准备给
学号留多宽?给姓名留多宽?自我介绍留多宽?
姓名如果留的过宽,比如20个字都能存,但是一般人的姓名就三四个字…浪费
如果留的过窄,导致存不下,更有问题。
对应的,A4纸空间有限,硬盘空间也有限,我们建列时,自然想到--能够容纳放置的内容,但是又不浪费。
存储同样的数据,不同列类型,所占据的空间和效率是不一样的,这就是我们建表前的列类型和意。
重点学习列类型的存储范围与占据的字节关系:
mysql三大列类型:数值型,字符串型,时间类型
数值型:
整型:
Tinyint---占据一个字节,存储范围-128-127,0-255
Smallint
Mediuint
Int
Bigint
Tinyint 1一个字节 8个位
0000 0000-----0 最小
1111 1111-----255 最大
大家知道,计算机为了表示一个数是负数,会把最高位(左侧)的0/1,当成符号看,如果为0,则为正数,如果为1,则是负数
0 0000000 ----0
0 1111111 ----127
1 0000000 ---- -0
1 1111111 ---- -127
二进制补码的问题,+0,-0,重复了,浪费了一种存储的可能性,因此计算机中的负数,不是照着“后面的绝对值直接乘-1得到的”,而是用补码规则换算的。
负数 = 绝对值为 -128
1111 1111 --- -1
1000 0000 --- -128
最终结果 -128-----127
分析:2个字节,16位 0---- 2^16-1 = 0 ---- 65535
-2^15----- +2^15= -32768 ---- +32767
一般而言,设某类型位N字节,8N位’
0 -------- 2^8N -1
-2^(8N-1) ---- +2^(8N -1)-1
对于int型:占的字节越多,存储的范围也越大。
Tinyint 怎么样让他存储0-255,又怎么样让他存储-128 -127
int系列的声明时的参数:(M) unsigend zerofill
练习tinyint的参数并验证字节宇范围的关系:
create table db2(
-> sname varchar(20) not null default '',
-> age tinyint not null default 0
-> )engine myisam charset utf8;
为其插入数据,age到底是-128到127,还是0-255呢?
加unsigned表示无符号,可以影响存储的范围
给学生加一个学分列 :alter table db2 add score tinyint unsigned not null default 0;
测试其范围
//在列类型加unsigned表示其无符号类型
分析(M)参数 :
Zerofill zero是零,fill是填充,代表0
M必须和zerofill配合才有意义
给学员增加一个学号列:学号不能为负,学号一般位数相同。不够位数用0填充
//snum统一补0,而且补到5位,为什么补到5位?因为M=5。
总结,M表示补0的宽度,和zerofill配合使用才有意义。
观察snum的类型,可知zerofill则同时必是unsigned类型。
浮点数在计算机里表示是比较复杂的,IEEE组织有详细的定义。IEEE745标准。
234.87
23.487
小数点左边 能大多少?
小数点右边 又能大到多少?
float(M,D),decimal(M,D)
M叫“精度”-----代表“总位数”,而D是“标度”,代表小数位(小数右边的位数)
张三炒股,每个月亏9999.99,李四是程序员,每个月赚9999.99。
将float定义成unsigned,并用零填充。
发奖金,给王五发888.88奖金。
王五迟到三次,扣300块钱
浮点数占多大的空间?
答:float 能存10^38.10^-38,如果M<=24,点4个字节,否则占8字节
用来表示数据中的小数,出来float---浮点。
还有一种叫定点decimal,定点是把整数部分和小数部分分开存储的,比float精确。