2020年11月09日 23:27 __ _ _ _ _

点击蓝色文字关注”程序员Bob”吧!

文章配图

生活需要热情,更需要自律,积极和勤奋,否则,生活只是存在日历上的天数。

文章配图

**趣味小谈
**

最近,在看一本《原则》的书籍,是写的一位美国人投资史。其中谈到和他的创业伙伴关系出现裂缝时,我们会怎样做?

原文如下:和我关系密切的人理解我,不讨厌我,有时甚至喜欢我,而那些与我联系不太密切的人被我的直率冒犯。很明显,我需要加深对别人的理解,别人也需要加深对我的理解。之后我意识到,在人际关系中,人们应当把各自的相处原则说得极为清楚,这至关重要。
我想,很多时候大家都会碰到这样或那样不被小伙伴理解的事情,那么事实上会不会是我们自己没和小伙伴说明清楚呢?包括小编自己也是,有时候奇怪的想法可能会和平时所想不一样,从而所表达出来的意思可能也就会和平常有误差,这时候我们也要学着和小伙伴说明清楚,毕竟不同的人会有着不同的理解,在成长的路上,继续加油
文章配图

**SQL学习历程
**
MySQL也有好几天没看了,部分语句都已不太熟悉,得赶快拿起来温习温习。
上次讲到了列类型的枚举类型,那么接下来还有集合记录长度,列属性倒不是特别多,也就有空属性,列描述以及默认值,所以学起来也是超快~

集合字符串
集合跟枚举实际上很类似,实际上存储的是数值,而不是字符串(集合可以多选) 集合定义:set 元素列表 使用:使用元素列表中的多个元素,使用逗号分隔
插入数据:使用多个元素字符串组合,也可以直接插入数值
相关语句:


-- 创建集合表create table my_set(hobby set ('篮球','足球','乒乓球','排球')-- 集合中每一个元素都是对应一个二进制位,被选中为1,没有则为0,最后一步反过来)charset utf8;
-- 插入数据insert into my_set values ('足球,乒乓球');insert into my_set values (3);-- 代表乒乓球:篮球+足球
-- 查看集合数据select hobby + 0, hobby from my_set;

值得注意,在查看数据时,我们会看到一些数字,如下:

文章配图

简述其数值原理:
原理:集合中每一个元素都是对应一个对应的二进制位,比如3,二进制位为0011,在集合中,每一个元素都是对应一个二进制位,被选中为1,没有则为0;最后反过来。即:集合中每一个元素都是对应的一个二进制位。
集合中元素的顺序是没有关系的:最终系统都会去匹配顺序,简单来说,便是存储与顺序无关,系统会自动匹配0和1,这样也节省了空间。
比如你第一次记录了篮球和足球,那么第二次你记录足球和篮球其数值是一样的,这也就是其存储与顺序无关。

集合的强大在于能够规范数据和节省空间:谈到数据规范,PHP也可以规范数据,对于PHP来说其效率优先,而数据的维护可以通过数字进行,从而会导致PHP的维护成本增加:PHP根本没有办法判断数据在数据库的形式。所以集合实际上很少用,枚举可能还会用,虽然效率低一些,但能判断元素的确切位置。

记录长度

在MySQL中规定:任何一条记录最长不能超过65535个字节(varchar最大为65536个字符,达不到理论值)。

那么varchar实际存储长度能达到多少呢?

实际存储长度主要看字符集编码:utf8和GBK下的varchar的实际顶配。

当我们输入相关语句查看时:


-- 求varchar在utf8和GBK下的实际最大值create table my_utf8(name varchar(21844))charset utf8;-- 填入65535时报错提示最大为21845,填入也为错:21845*3+2>65535.正确的为21844*3+2create table my_gbk(name varchar(32766))charset gbk;-- 同理,报错提示最大为32767,填入也为错32767*2+2>65535,正确的为32766

文章配图

在执行上面语句时大家可能还会想到其实会多出一个字节,那么想要用完是否可以添加tinyint字段呢?
实际上是不行的,因为MySQL记录中:如果任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL,若想释放NULL所占用的字节:必须保证所有的字段都不允许为空。
如添加tinyint字段后报错:

文章配图

那么怎样才可以呢?

输入以下语句时:


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 not null  -- not null 用于判断text是否占用为10个字节)charset utf8;

执行结果:文章配图** 下面可以开始讲述列属性的三个小部分啦~ ** 列属性
是真正约束字段的数据类型。
列属性有很多:NULL/NOT NULL,default,primary key,auto_increment,comment(描述表的字段)
这里讲到的是空属性,列描述和默认值。

空属性
两个值:NULL(默认的)和NOT NULL(不为空)
数据值是默认的,且数据库基本都是字段为空;但是实际上在开发的时候,是需要尽可能的保证所有的数据都不应该为空:因为空数据无意义,也没有办法参与运算(如下图):

文章配图

再创建一个实际案列表:班级表(名字,教室)
相关语句:


-- 创建班级表(数据!)create table my_class(name varchar(20) not null,room varchar(20) null  -- 允许为空;不写默认允许为空)charset utf8;

然后查看该表中数据(no代表不能为空):

文章配图

列描述(注释)
列描述:comment,起描述作用,无实际意义。是专门用来描述字段,根据表的创建语句一起保存的。
当数据很相似时,数据管理员不怎么方便查看,这就给数据库管理员带来了麻烦,那么列描述的作用就显现出来了。
创建表以及相关语句:


-- 创建表create table my_teacher(name varchar(20) not null comment '姓名',money decimal (10,2) not null comment '工资')charset utf8;

执行如下:

文章配图

默认值
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值或者自己选择不使用默认值。
默认值关键字: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 ('小明');insert into my_default  values ('小明1号',18,default);

执行结果如下:

文章配图

文章配图

往期推荐:

博客更新:Hexo更新到5.2.0版本血泪踩坑史 2020-11-06
文章配图

《人生十讲》书评:不完满才是人生… 2020-11-02
文章配图

趣味C语言(C语言游戏滚动的“o”) 2020-11-04
文章配图

为你,千千万万遍.

关注 程序员Bob 公众号,与你一起终生学习

文章配图

一键三连,就差你了
文章配图

预览时标签不可点

阅读




__