sql-2
mysql的数据类型,列类型,字段类型
三大类:
数值,字符串,日期时间
数值
整数,int
int 4个字节。
还有占用其他空间的整型:
tinyint 1
smallint 2
mediumint 3
int 4
bigint 8
创建my_int表:
mysql的整型,有php整型不具备的概念:
one,无符号
只能表示整数或0。那么最大的整数会很大!
默认是 有符号!可通过 整型的 unsigned选项,int unsigned 设置整型无符号
two,显示宽度
显示宽度,不决定整型的范围。而决定 在显示出该数之后,如果宽度不够,则采用前导零补齐!此时需要 额外的属性 zerofill 来设置!
如果超过设置的宽度 不会报错:
可见 无符号,默认的显示宽度是 10,因此全都使用0来补齐。
可以设置整型的显示宽度!在 int(M)即可!
额外的,mysql中,没有 布尔型!
但是 存在 Boolean这个关键字,表示 tinyint(1)
典型的,0表示假,1表示真!
浮点数,float,double
单精度,float,4个字节
双精度,double,8个字节
在定义浮点数,典型的需要指明其 有效位数,和 小数位数
float(M,D)
double(M,D)
M:所有的有效位数
D:其中的小数位数
以上两个值,决定一个浮点数的有效范围!
典型的浮点数
float(10, 2);
99999999.99
注意,浮点数,近似值,不是精确值!如果一个数,很大,接近最大值,可能出错!
一旦出现精确数据(小数)需要保存可以使用,下面的定点数
定点数,decimal
小数点是固定的!
decmal,与定义浮点数一致,也有 有效位数与小数位数的概念:
decimal(M,D)
不是 数的形式存储,类似于字符串的形式!
注意,关于小数:
1,支持 科学计数法7e3
2,同样支持 unsigned,无符号!
3,同样支持 zerofill,
TIP:小数的M,即表示有效范围,也表示显示宽度!(而整数的M只表示显示宽度)
字符串类型
char
最基本(定长)的字符串类型!
用于保存,长度固定的内容!
速度快,但是保存变长数据,会浪费空间!
varchar
可变长度的字符串!
用于保存长度可变的数据!
保存变长数据时,节省空间,处理起来麻烦些!
char(L),varchar(L)
L,表示每个数据的最大长度!单位是 字符数(不是字节数)
L 表示最大长度!
L的值不是多大都可以!
有最大值:
1,mysql一条记录最大不能超过65535个字节!(字段的长度加起来,不能超过这个值)
2,长度单位是字符数,与编码是相关的!
采用单字节编码测试下:
Latin1
测试发现只有一个字段,而且是单字节字符集,还是不能是65535,原因是?
为什么是 65532呢,少了三个字节:
3,由于varchar是变长,需要记录下真实的数据到底有多长!每个varchar类型的数据,还需要额外的1个或2个字节保存真实数据的长度!(取决于真实数据的长度)
4,整条记录,还需要一个字节来保存那些字段为null
但是,在使用时,varchar 超过255就选择 text来保存!
text
文本,不限长度的字符串!
该字段,不需要指定长度,而且也不会算入到记录的总长度内!
比如:文章管理系统 有会文章 可以选择使用text这个字符串类型来存储
bolb
它是将数据转换为二进制来进行存储 比如我真正的存储一个图片到数据库 只会存储改所在的路径!
选择
定长,char
变长较短(255)个字符之内,varchar
变长,较长,text
枚举,enum,单选
需要在定义枚举类型时,列出哪些是可能的!
sex enum(‘男’,’女’,’保密’);
在处理时,类似 字符串型进行操作!
意义在于:
1, 限定值的可能性!
2, 速度快,比普通的字符串速度快!
原因是 枚举型 是利用 整数进行管理的
每个值,都是一个整数标识,从第一个选项开始为1, 逐一递增!
管理时整数的形式,速度比字符串快!
站在mySQL的角度 建议使用enum来存储类似于单选的这种数据 ,但是站在PHP的角度来说 建议不要使用
集合,set,复选
类似于 enum枚举,在定义时,也需要指定其已有值!
集合:是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制位来进行控制:1表示该选项被选中,0表示该选项没有被选中。
基本语法:set(‘值1’,’值2’,’值3’…)
系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元
1个字节:set只能有8个选项
2个字节:set只能有16个选项
3个字节:set只能表示24个选项
8个字节:set可以表示64个选项
分析数据存储的方式
1, 系统将对应的数据选项(设计)按照顺序进行编排:从第一个开始进行占位,每一个都对应一个二进制位。
2, 数据在存储的时候,如果被选中,那么对应的位的值就为1,否则为0
3, 系统在进行存储的时候会自动将得到的最终的二进制颠倒过来,然后再进行转换成十进制存储
注意:站在 mysql的角度,尽量多用 枚举和集合!
但是站在php操作mysql的角度,尽量少用!(兼容性差)
日期时间
Date
日期类型:系统使用三个字节来存储数据,对应的格式为:YYYY-mm-dd,能表示的范围是从1000-01-01 到9999-12-12,初始值为0000-00-00
Time
时间类型:能够表示某个指定的时间,但是系统同样是提供3个字节来存储,对应的格式为:HH:ii:ss,但是mysql中的time类型能够表示时间范围要大的多,能表示从-838:59:59~838:59:59,在mysql中具体的用处是用来描述时间段。
Datetime
日期时间类型:就是将前面的date和time合并起来,表示的时间,使用8个字节存储数据,格式为YYYY-mm-dd HH:ii:ss,能表示的区间1000-01-01 00:00:00 到9999-12-12 23:59:59,其可以为0值:0000-00-00 00:00:00
Timestamp
时间戳类型:mysql中的时间戳类型只是表示从格林威治事件开始,但是其格式依然是:YYYY-mm-dd HH:ii:ss
Year
年类型:占用一个字节来保存,能表示1900~2155年,但是year有两种数据插入方式:0~99和四位数的具体年
year进行两位数插入的时候,有一个区间划分,零界点为69和70:当输入69以下,那么系统时间为20+数字,如果是70以上,那配系统时间为19+数字
建议插入4位数的年份!!!
更新这一条记录的其它字段 那么timestamp 这个类型会自动更新
因为在PHP中有强大的date()与strtotime()函数 所以站在PHP的角度这个日期时间类型用的不用。
列属性,字段约束
NULL,not null属性 空约束
mysql的NULL不是数据,也不是类型!只是标识字段属性!
用于说明某个字段,是否可以为null(是否可以什么都不存)
NULL采用关键NULL表示!(不是字符串)
是:NULL,而不是:‘NULL’
属性:
null 表示可以为空
not null,表示不能为空
如果,在添加数据时 ,没有指定值,也可能会是NULL!
default属性,默认值约束
Default:默认值,当字段被设计的时候,如果允许默认条件下,用户不进行数据的插入,那么就可以使用事先准备好的数据来填充:通常填充的是NULL
主键约束/唯一约束,primary unique
站在约束的角度,限制的,该字段,值要唯一!
但是 主键 与 唯一 不是一个概念:
都是索引的一种!
主键:
可以唯一标识记录的字段,称之为主键!
唯一:
保证在某个字段上的数据是唯一的,可以设置成唯一约束!
但是,一个表,只能有一个主键!
典型的,在创建表时,主动增加一个 非实体的自然属性,充当主键,采用整型,运算速度快!
其他的唯一字段,建立唯一约束!
建立:
两种方案:
在创建表的时候给某一个字段添加主键
表已经创建成功 需要给这个表添加一个主键
一旦创建了主键:
默认就是不能为空:
唯一,使用 unique key 来创建!
唯一键是可以有多个的
一个表可以有多个唯一,但是只能有一个主键!
注意:主键或者是唯一,都可以由 多个字段组成!
因此,主键 与 字段的概念:字段来充当主键,不是字段就是主键!尽量采用 id 一个来作为主键!
如果管理的主键/唯一呢
删除主键:
alter table表名 drop primary key;
添加主键
alter table 表名 add primary key(字段列表);
删除唯一
alter table 表名 drop index index_name;
索引的名字,可以通过 show create table 看到!
增加唯一
alter table 表名 add unique key 索引名字 (字段列表)
alter table 表名 add unique index 索引名字 (字段列表)
建议索引名字使用反引号包裹
自动增长,auto_increment
用于主键,只有一个字段主键,才能使用auto_increment!
可以,从1开始,逐一递增的数值!
典型的,从1 开始,没有负数,可以采用 无符号 unsigned整型!
注意: unsigned,不是列属性,是类型的一部分!(包括zerofill)因此位置上与类型在一起!
comment,注释
主要是用于给字段进行注释 方便自己和他人阅读字段的含义
id 学号 姓名 性别 年龄 籍贯 所属班级
班级表
id 班级 教室号
关系(二维表)的设计规范,范式
范式,NF,normal format,就是指对表的结构的要求!
目的:1,规范结构!2,减少数据冗余!
第一范式,1NF,字段原子性
要求字段不能再分,要求字段的原子性
第二范式,2NF,非部分依赖
增加唯一主键即可!ID
范式的要求,是逐渐递增!
在 满足 了 第一范式的前提下,不能出现部分依赖!
部分依赖指的是:普通字段 对 主键 是完全依赖的,而不应该是依赖主键的一部分!
依赖:可以通过那个 字段去决定另一个字段
因此,出现主键部分依赖的前提是,出现 复合主键!
消灭复合主键即可!增加一个唯一字段的主键即可。增加一个与业务逻辑毫无关系的,唯一的ID主键,int unsigned primary key auto_increment
第三范式,3NF,非依赖传递 反第三范式|逆第三范式
在满足第二范式的前提下,取消 传递依赖,就是第三范式!
传递依赖:如果 字段B对字段A有依赖,而字段C对字段B存在依赖。则出现了传递依赖!
称之为传递依赖!
总结:
每个实体建立一个表,为每个表增加一个主键ID即可!
一对一
一对多
多对多

浙公网安备 33010602011771号