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表示真!

 

浮点数,floatdouble

单精度,float4个字节

双精度,double8个字节

 

在定义浮点数,典型的需要指明其 有效位数,和 小数位数

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的值不是多大都可以!

有最大值:

1mysql一条记录最大不能超过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:59mysql中具体的用处是用来描述时间段

Datetime

日期时间类型:就是将前面的datetime合并起来,表示的时间,使用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进行两位数插入的时候,有一个区间划分,零界点为6970:当输入69以下,那么系统时间为20+数字,如果是70以上,那配系统时间为19+数字

建议插入4位数的年份!!!

 

 

 

 

 

更新这一条记录的其它字段  那么timestamp 这个类型会自动更新

 

 

 

因为在PHP中有强大的date()strtotime()函数  所以站在PHP的角度这个日期时间类型用的不用。

 

列属性,字段约束

NULLnot null属性  空约束

mysqlNULL不是数据,也不是类型!只是标识字段属性!

用于说明某个字段,是否可以为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  班级  教室号

关系(二维表)的设计规范,范式

范式,NFnormal format,就是指对表的结构的要求!

目的:1,规范结构!2,减少数据冗余!

 

第一范式,1NF,字段原子性

要求字段不能再分,要求字段的原子性

 

 

第二范式,2NF,非部分依赖

增加唯一主键即可!ID

 

范式的要求,是逐渐递增!

满足 第一范式的前提下,不能出现部分依赖

部分依赖指的是:普通字段 主键 是完全依赖的,而不应该是依赖主键的一部分!

依赖:可以通过那个 字段去决定另一个字段

 

因此,出现主键部分依赖的前提是,出现 复合主键!

 

 

 

消灭复合主键即可!增加一个唯一字段的主键即可。增加一个与业务逻辑毫无关系的,唯一的ID主键,int unsigned primary key auto_increment

 

 

 

第三范式,3NF,非依赖传递  反第三范式|逆第三范式

在满足第二范式的前提下,取消 传递依赖,就是第三范式!

 

传递依赖:如果 字段B对字段A有依赖,而字段C对字段B存在依赖。则出现了传递依赖!

 

称之为传递依赖!

 

 

总结:

每个实体建立一个表,为每个表增加一个主键ID即可!

 

 

一对一

一对多

多对多

posted @ 2017-10-06 22:18  奋斗的黑蜗牛1号  阅读(189)  评论(0)    收藏  举报