六天帶你玩轉mysql資料庫-- 第二天筆記
阿新 • • 發佈:2018-12-18
集合字串:
集合跟列舉很類似,實際儲存的是數值,而不是字串(集合是多選)
集合使用方式:定義,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;