六天带你玩转mysql数据库-- 第二天笔记(下)

集合字符串:

集合跟枚举很类似,实际存储的是数值,而不是字符串(集合是多选)
集合使用方式:定义,set(元素列表);使用:可以使用元素列表中的元素(多个),使用逗号分隔

在这里插入图片描述
创建集合表:

-- 创建集合表
create table my_set(
hobby set('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')
)charset utf8;

desc my_set;

在这里插入图片描述

插入数据:可以使用多个元素字符串集合,也可以直接插入数值。

-- 插入数据
insert into my_set values('足球,台球,网球');
insert into my_set values(3);

在这里插入图片描述

查看数据:数值+数据查看

--98转换成二进制=64+32+2=01100010
集合中每一个元素都是对应一个二进制位,被选中为1,没有则为0:最后将二进制次序反过来
-- 创建集合表
create table my_set(
hobby set('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')
--                足球				    台球   网球
-- 集合中:每一个元素都是对应一个二进制位,被选中为1.没有则为0;最后反过来
	    0     1       0       0         0       1        1      0
-- 反过来   01100010与98转换成为的二进制对应
)charset utf8;

在这里插入图片描述

集合原理:

-- 插入数据
insert into my_set values(255);   -- 255对应二进制8个1,0-255即256个数字,所以查看的时候应该是全部

-- 查看集合数据
select hobby +0 ,hobby from my_set;

在这里插入图片描述

集合中元素的顺序没有关系,最终系统都会匹配数据。

-- 颠倒元素出现的顺序
insert into my_set values('网球,台球,足球');

在这里插入图片描述

集合的强大在于能够规范数据和节省空间;PHP也可以规范数据,但是对于PHP来说效率优先,而且数据的维护可以通过数字
进行,增加PHP的维护成本;PHP根本没办法判断数据在数据库的形式。很少使用集合的方式

mysql记录长度:

mysql中规定任何一条记录长度最长不超过65535字节,(varchar永远达不到理论值)
varchar实际存储长度能达到多少呢?看字符集编码
utf8下varchar的实际顶配21844字符:
gbk下的varchar的实际顶配32766字符:
-- 求出varchar在utf8和gbk下的实际最大长度:
create table my_utf8(
name varchar(65535)
)charset utf8;

create table my_gbk(
name varchar(65535)
)charset gbk;
提示长度太大并给出了最大长度。

在这里插入图片描述

根据给出的最大长度进行创建:

-- 求出varchar在utf8和gbk下的实际最大长度:
create table my_utf8(
name varchar(21845)
)charset utf8;

create table my_gbk(
name varchar(32767)
)charset gbk;

在这里插入图片描述

计算出最大长度:

-- 求出varchar在utf8和gbk下的实际最大长度:
create table my_utf8(
name varchar(21844)   -- 应该为21844,所占字节21844*3+2=65532+2=65534
)charset utf8;

create table my_gbk(
name varchar(32766)   -- 应该为32766,所占字节32766*3+2=65532+2=65534
)charset gbk;

在这里插入图片描述

如上计算出来了65534,还剩余一个字节,用完整个65535字节,增加一个tinyint字段:

增加一个tinyint发现失败:
create table my_utf81(
age tinyint,
name varchar(21844)   -- 应该为21844,所占字节21844*3+2=65532+2=65534
)charset utf8;

create table my_gbk1(
age tinyint,
name varchar(32766)   -- 应该为32766,所占字节32766*3+2=65532+2=65534
)charset gbk;

在这里插入图片描述

mysql记录中:如果有任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL(想释放NULL所占用的字节,必须保证所有的字段都不允许为空)

-- 释放NULL
create table my_utf82(
age tinyint not null,
name varchar(21844) not null   
)charset utf8;

create table my_gbk2(
age tinyint not null,
name varchar(32766) not null   
)charset gbk;

在这里插入图片描述

mysql中text字符串,不占用记录长度,额外存储,但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度:10个字节(保存数据的地址和长度)

-- text占用10个字节长度
create table my_text(
name varchar(21841) not null, 
content text
)charset utf8;

-- 解决问题证明了text占用10个字节
create table my_text(
name varchar(21841) not null, -- 21841 * 3 + 2 = 65523 + 2 = 65525
content text not null        -- 10
)charset utf8;

在这里插入图片描述

列属性:

列属性:真正约束字段的是数据类型,但是数据类型的约束很单一,需要有一些额外的约束,来更加保证数据的合法性。
列属性有很多:NULL/not NULL,default,Primary key,unique key,auto_increment,comment.
空属性:
两个值:NULL(默认的)和NOT NULL(不为空),虽然默认的数据库基本都是字段为空,但是实际上在真实开发的时候
尽可能的要保证所有的数据都不为空,空数据没有意义没办法参与运算。

在这里插入图片描述

创建一个实际案例表:班级表(名字,教室)

-- 创建班级表
create table my_class(
name varchar(20) not null,  -- 考虑实际边界值,不为空
room varchar(20)  -- 不加not null,就是默认允许为空 
)charset utf8;

在这里插入图片描述

列描述:

列描述:comment,描述,没有实际含义,是专门用来描述字段,会根据表创建语句保存;
来给数据库管理员来进行了解的(也即一些注释,我们写代码的时候要注意注释因为这个也是互相分享的,注重代码分格)
-- 创建表
create table my_teacher(
name varchar(20) not null comment '姓名',
money decimal(10,2) not null comment '工资'
)charset utf8;

desc my_teacher;

show create table my_teacher;

在这里插入图片描述

列属性(默认值):

默认值:某一种数据会经常性的出现某一个值。可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
默认值关键字:default
-- 默认值
create table my_default(
name varchar(20) not null,
age tinyint unsigned default 0,
gender enum('男','女','保密') default '男'
)charset utf8;

在这里插入图片描述

默认值的生效:在数据进行插入的时候,不给数据进行赋值。

-- 插入数据
insert into my_default (name) values('薛飞龙');
select * from my_default;

在这里插入图片描述

想要使用默认值,可以不一定去指定列表,故意不使用字段列表,可以使用default 关键字代替值。

insert into my_default values('项媛媛',18,default);
select * from my_default;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/aaaaaab_/article/details/83505373