趣味小谈
最近,在看一本《原则》的书籍,是写的一位美国人投资史。其中谈到和他的创业伙伴关系出现裂缝时,我们会怎样做?
原文如下:和我关系密切的人理解我,不讨厌我,有时甚至喜欢我,而那些与我联系不太密切的人被我的直率冒犯。很明显,我需要加深对别人的理解,别人也需要加深对我的理解。之后我意识到,在人际关系中,人们应当把各自的相处原则说得极为清楚,这至关重要。
我想,很多时候大家都会碰到这样或那样不被小伙伴理解的事情,那么事实上会不会是我们自己没和小伙伴说明清楚呢?包括小编自己也是,有时候奇怪的想法可能会和平时所想不一样,从而所表达出来的意思可能也就会和平常有误差,这时候我们也要学着和小伙伴说明清楚,毕竟不同的人会有着不同的理解,在成长的路上,继续加油
。
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+2
create 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);
执行结果如下: