1. 程式人生 > >六天帶你玩轉mysql資料庫-- 第二天筆記

六天帶你玩轉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;

在這裡插入圖片描述