bit[(M)] :位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1
如下图,在插入10的时候,a列未显示,在插入65的时候,却显示了,这是因为bit字段在显示时,
是按照ASCII码对应的值显示,而ASCll码表的有些符号是不可打印的!
INT
有符号的范围是-2^31~2^31-1,无符号的范围是2^32-1
FLOAT
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
如下图,float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入
decimal和float差不多,无论是有符号的,还是无符号的。而区别在于表示的精度不一样,
decimal
更精确
建议:如果希望小数的精度高,推荐使用decimal
字符串类型
CHAR
char(L):固定长度字符串,L是可以存储的长度,单位为
字符
,最大长度值可以为255
如下图,char(3),表明可以存储三个字符,可以是字母或者是汉字,但不能超过3个
VARCHAR
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
varchar括号内的len有多大,与编码密切相关!
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效
字
节数是65532
utf8时,是65532/3=21844,一个字符占用3个字节;gbk时,是65532/2=32766,一个字符占用2
个字节!
CHAR与VARCHAR的区别
类似于string与char str[64],一个定长的,确定了空间,string则是你需要多少,就给你多少空间
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去
定长的磁盘空间比较浪费,但是效率高;变长的磁盘空间比较节省,但是效率低
定长的意义是,直接开辟好对应的空间;变长的意义是,在不超过自定义范围的情况下,用多少,
开辟多少
日期和时间类型
date :日期 'yyyy-mm-dd' ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime完全一致,占用
四
字节
如下图,时间戳没有填,它显示的是插入数据的时间
如下图,在更新日期后,时间戳也跟着变了,只有时间日期不变!
如下图,我们填的不完整时,在一定程度上能够补齐;也有可能会报错!
enum
枚举,“单选”类型,enum('选项1','选项2','选项3',...);
实际存储的其实是数字,1,2,3,....最多65535个,所以可以插入数字,来达到我们想要的效果,但
不建议这么做,最好还是插入男、女等直观上的字
set
set:集合,“多选”类型,set('选项值1','选项值2','选项值3', ...);
也可以通过数字来插入,只不过和枚举不一样的是,它是按bit位来的,类似于位图,比如插入3,
3的二进制是0011,第一个和第二个bit位为1,就会把网球和篮球都插入进去
如下图,在查找时,=号是严格查找的,而如果我们要的是包含某一个事物的全部拥有者,就要用
到find_ in_ set函数
如下图,就把全部喜欢网球的都找出来了!
表的约束
mysql是和数据打交道的,mysql一定要尽量保证数据不要出现"偏差",所以mysql为了让自己的
表结构里面的数据完整性一致性非常强,mysql是要给我们提供强约束的!!!
空属性
null(默认的)和not null(不为空),实际开发时,尽可能保证字段不为空,因为数据为空没办法参
与运算!
在MySQL中,null和0是不一样的,null表示不存在!
例如:如果班级没有名字,你不知道你在哪个班级,如果教室名字可以为空,就不知道在哪上课,
这样就要求我们在创建表时,班级和教室名,不能为null,必须插入数据!
默认值
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户
可以选择性的使用默认值
如下图,在not nll和default同时存在,且不给该列插入数据时,会使用default,忽略not null,
最好不要同时有not null和default!
comment
没有实际含义,只是对列进行说明,有点类似于C语言的注释
如下图,desc查看表结构,是无法看到comment写的说明的,需要show查看创建表的详情
zerofill
我们前面创建int类型的列时,查看表结构会是int(11),就显得很奇怪,其实没有zerofifill这个属
性,括号内的数字是毫无意义的!
如下图,在添加了zerofill后,如果数字的宽度不够int括号内的值,它会自动补齐
如下图,在MySQL中实际存储的还是原来插入的值!
主键
数据库存入数据不是唯一目的,也要方便提取!一般而言,要求数据库表中的记录,有一个特定的
唯一标识,标志唯一性!
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能
有一个主键;主键所在的列通常是整数类型
如下图,设置主键后,该列会自动设为不能为空!
删除主键
alter table 表名 drop primary key;
添加主键
alter table 表名 add primary key(属性列)
如下图,如果你要在某一列添加主键时,即给整个表添加主键,那该列就一定不能有重复值,否则
不能添加
!
复合主键
如果有多个字段作为主键,可以使用复合主键!
如下图,id与course一起才算作主键!
如下图,只有当插入的数据与表中的数据id与course同时相同时才会报错,无法插入!
自增长
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的
最
大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
如下图,最大值+1增长!
如下图,某一列要设为自增长,就必须是具有唯一性属性列!
唯一键
唯一键所在的列可以为null!!!
如下图,在给id设为unique后,就不能插入重复的id值了!设为unique的属性列可以为NULL,这
也是与主键最大的区别,而
下图可以重复插入NULL,则是因为NULL表示不存在,而不存在就没
有比较,也就谈不上重复了!!!
如下图,在给设为唯一键的属性列设为不能为null后,就直接变为了主键了!
主键与唯一键
主键和唯一键并不冲突!在一张表中可以有一个主键,也可以同时具有唯一键!
表其实就是MySQL级别的"类or结构体对象"的集合,表中保存的其实就是某些场景下的属性字
段!
主键不是设置了主键属性,你才成为主键的,而是对应的属性被选择成为主键!而没有成为主键属
性,但是依旧需要唯一性的列属性,所以就有了unique键,这是因为数据库本身是一个对数据约
束非常严格的技术!!!
需要具有唯一属性的列:比如身份证号
码,电话号码,QQ号等等,不需要具有唯一性的列有姓
名,年龄等等
外键
如下图有两张表,这两张表通过class_id关联起来,class_id在语义上,叫做外键,class_id为主
键属性列的表被称为主表,另一个则被称为从表,如下图中的班级表为主表,学生表为从表!
如果我们要在学生表中插入一个学生,信息为id:102,name:王五,class_id:30,但是显然
是不能插入的,因为班级表中没有这个班级;如果我们要删除20班,java大神班,也无法删掉,因
为该班级还有学生!!!
通过外键产生关系的表,除了在逻辑上要有关联,被称为外键;mysql在操作上也要维护这种逻辑
关系的正确性,也被称为外键约束!
如下图,必须先创建主表,再创建从表,顺序不能颠倒!
如下图,得Class表中有班级,才能插入这些班级的学生;同样,得Stu中没有某一班级的学生
了,才能在Class表中删除该班级!