字元編碼、欄位型別與欄位約束條件
阿新 • • 發佈:2022-05-06
字元編碼
字元編碼相關
檢視字元編碼
在cmd視窗登入資料庫客戶端以後鍵入以下命令
\s
"""
如果是5.X系列 顯示的編碼有多種
latin1
gbk
如果是8.X系列 顯示的統一是utf8mb4
utf8mb4是utf8優化版本 支援儲存表情
"""
字元編碼配置檔案
5.X版本mysql資料庫預設編碼有多種 可能會導致亂碼的情況 所以應該統一編碼 my-default.ini配置檔案 步驟1:拷貝一份該配置檔案並修改名稱為my.ini 步驟2:清空my.ini檔案內的內容 步驟3:新增固定的配置資訊即可 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 步驟4:儲存並重啟服務端即可生效 net stop mysql net start mysql
儲存引擎
儲存引擎理論
儲存引擎可以理解為處理資料的不同方式
儲存引擎的檢視
show engines;
需要掌握的儲存引擎的種類
MyISAM
是5.1x版本以前的mysql資料庫預設的儲存引擎,具有存取資料速度快、功能少、安全性低
的特點
InnoDB
5.1版本以後的mysql資料庫預設的儲存引擎,具有多功能 安全性較高 存取速度沒有MyISAM快
的特點
BlackHole
具有寫入任何的資料都會消失
的特點
Memory
具有以記憶體作為資料存取地 速度快但是斷電立刻丟失資料
的特點
自定義儲存引擎
句式create table 表名(欄位名 欄位型別)engine=儲存引擎名
例create table t1(id int)engine=myisam;
建立表的完整語法
create table 表名( 欄位名1 欄位型別(數字) 約束條件, 欄位名2 欄位型別(數字) 約束條件, 欄位名3 欄位型別(數字) 約束條件 );
- 欄位名和欄位型別是必須的
- 數字和約束條件是可選的
- 約束條件可以寫多個 空格隔開即可(後面詳細講解)
欄位名1 欄位型別(數字) 約束條件1 約束條件2 約束條件3 - 最後一行欄位結尾不能加逗號
欄位型別
整型
tinyint 1bytes smallint 2bytes int 4bytes bigint 8bytes 上述整型的區別在於從上往下能夠儲存的數字範圍越來越大 注意事項 1.需要考慮正負數的問題 如果需要儲存負數 則需要佔據一個位元位 2.注意手機號如果使用整型來儲存 需要使用bigint才可以 """ 工作小技巧:有時候看似需要使用數字型別儲存的資料其實可能使用的是字串 因為字串可以解決不同語言對數字不精確的缺陷!!! """ create table t5(id tinyint); insert into t5 values(-129),(256); # 如果是在5.6版本不會報錯 會自動處理成最大範圍(沒有意義) 步驟1:set global sql_mode = 'STRICT_TRANS_TABLES'; 步驟2:退出客戶端 重新登入即可 # 如果是在5.7及以上版本 則會直接報錯(更加合理) 驗證(結論)發現所有的整型都預設帶有正負號 如何修改不帶正負號(約束條件) create table t6(id tinyint unsigned);
浮點型
float
double
decimal
上述浮點型從上往下精確度越來越高
float(255,30) 總共255位 小數位佔30位
double(255,30) 總共255位 小數位佔30位
decimal(65,30) 總共65位 小數位佔30位
重點研究精確度問題
create table t7(id float(255,30));
create table t8(id double(255,30));
create table t9(id decimal(65,30));
insert into t7 values(1.11111111111111111);
insert into t8 values(1.11111111111111111);
insert into t9 values(1.11111111111111111);
decimal>double>float
"""
雖然三者精確度有差距 但是具體用哪個應該結合實際情況
比如正常業務 使用float足夠
如果是高精尖 可以使用decimal
"""
字元型
char
varchar
上述兩個字元型別的區別在於一個是定長一個是變長
eg:
char(4)
定長 最大隻能儲存四個字元 超出則報錯 不夠則空格填充至四個
varchar(4)
變長 最大隻能儲存四個字元 超出則報錯 不夠則有幾個存幾個
驗證定長與變長特性
create table t10(name char(4));
create table t11(name varchar(4));
insert into t10 values('jason');
insert into t11 values('jason');
# 如果是5.6版本並且沒有修改嚴格模式 則會自動擷取四個字元(不合理)
# 臨時修改
步驟1:set global sql_mode = 'STRICT_TRANS_TABLES';
步驟2:退出客戶端 重新登入即可
# 永久修改
修改my.ini配置檔案
sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY'
重啟服務端之後永久生效
"""
課外擴充套件研究
char_length() 獲取欄位資料的長度
該方法無法直接獲取到定長的真實長度
因為MySQL在存資料的時候會自動填充空格在取資料的時候又會自動移除空格
能不能讓MySQL在取資料的時候不自動移除空格
單次修改
set session sql_mode = 'pad_char_to_full_length'
"""
# 工作中使用char還是varchar
char
整存整取 速度快
會造成一定的儲存空間浪費
'''
jasonkevintony tom jerry
'''
varchar
節省儲存空間
存取資料的速度沒有char快(取資料不知道資料的精確長度)
'''
varchar在存資料的時候會生成一個1bytes的報頭 記錄資料長度
varchar在取資料的時候先會讀取1bytes的報頭 從中獲取真實資料長度
1bytesjason1bytes+kevin1bytes+tony
'''
# 以前幾乎使用的都是char 現在varchar使用頻率也越來越高
"""
兩者都有使用場景
比如:
針對統一中國人的姓名 應該採取那個型別 >>> varchar
規模較小 資料量相對固定的字典 >>> char
很多時候欄位型別的選取和命名都會在郵件中標明(組長、架構師、產品)
"""
數字的含義
欄位型別括號內的數字大部分情況下是用來限制儲存的長度
但是在整型中並不是用來限制長度 而是用來控制展示長度
create table t12(id int(3));
insert into t12 values(1111); # 不會報錯
create table t13(id int(3) zerofill); # 位數不夠用0填充
insert into t13 values(1); # 001
insert into t13 values(1111); # 有幾位就展示幾位
"""
結論
以後涉及到整型欄位 都無需自己定義長度 直接使用自帶的即可
而針對其他型別的欄位 則需要自己新增數字
"""
列舉與集合
列舉
多選一
create table t14(
id int,
name varchar(32),
gender enum('male','female','others')
);
'''插入資料的時候 針對gender只能填寫提前定義好的數值'''
集合
多選多(也可以多選一)
create table t15(
id int,
name varchar(32),
hobby set('籃球','足球','雙色球','排球','水球','肉球')
);
列舉與集合都是該欄位資料只能從給出的預設的資料裡選。否則會報錯。列舉是多選一,集合是多選一或多
日期型別
date 年月日
datetime 年月日時分秒
time 時分秒
year 年
create table t16(
id int,
name varchar(32),
reg_time datetime,
birth date,
study_time time,
join_time year
);
# 針對時間資料一般都是通過程式碼自動獲取並新增 我們這裡手動模擬
insert into t16 values(1,'jason','2000-11-11','2002-01-21','11:11:11','2015');
約束條件
約束條件是基於欄位型別之上的額外限制
eg: id int unsigned
欄位型別int規定了id欄位只能存整數
約束條件unsigned指的是整數基礎之上還必須是正數
unsigned (無需正負號)
zerofill(零填充)
對於位數不夠的整型資料用零進行填充
not null(非空)
not null
create table t17(id int,name varchar(32));
'''插入資料的另外一種方式 打破欄位順序'''
insert into t17(name,id) values('jason',1);
insert into t17(id) values(2);
create table t18(id int,name varchar(32) not null);
insert into t18(id) values(2); # 報錯
insert into t18(id,name) values(2,null); # 報錯
insert into t18(id,name) values(2,''); # 不報錯
default (預設值)
default
create table t19(id int,name varchar(32) default 'jason');
insert into t19(id) values(1);
insert into t19(id,name) values(2,'kevin');
unique (唯一值)
unique
'''單列唯一:某個欄位下對應的資料不能重複 是唯一的'''
create table t20(
id int,
name varchar(32) unique
);
'''多列唯一:多個欄位下對應的資料組合到一起的結果不能重複 是唯一的'''
create table t21(
id int,
host varchar(32),
port int,
unique(host,port)
);
primary key (主鍵)
"""
1.單從約束層面上而言 相當於not null + unique(非空且唯一)
create table t22(id int primary key);
2.是InnoDB儲存引擎規定的一張表有且必須要有一個主鍵 用於構建表
主鍵可以加快資料的查詢速度(類似於書的目錄)
如果建立表建立的時候沒有設定主鍵也沒有其他的鍵 那麼InnoDB會採用一個隱藏的欄位作為表的主鍵(隱藏就意味著而無法使用 即無法加快資料查詢)
如果沒有主鍵但是有非空且唯一的欄位 那麼會自動升級成主鍵(從上往下的第一個)
create table t23(
tid int,
pid int not null unique,
cid int not null unique
);
"""
結論:建立表應該有一個序號欄位(id\pid\cid)並且應該將該欄位設定成主鍵
create table t24(
id int primary key,
name varchar(32)
);
# 也可以有聯合主鍵(多個欄位組合 本質還是一個主鍵) 瞭解即可
create table t24(
id int,
name varchar(32),
pwd int,
primary key(id,pwd)
);
auto_increment (自增)
auto_increment
專門配合主鍵一起使用 使用者以後在新增資料的時候就不需要自己記憶主鍵值
create table t25(
id int primary key auto_increment,
name varchar(32)
);
"""
總結
以後在建立規範的表的時候
一般都會有一個主鍵欄位的編寫如下
id int primary key auto_increment
"""
自增特性
主鍵的自增特性(除truncate
刪除資料並重置主鍵值)無法逆轉。
create table t1(
id int primary key auto_increment,
name varchar(32)
);
insert into t1(name) values('jason'),('kevin'),('tony');
insert into t1(name) values('oscar'); # id=4
delete from t1 where id=4;
insert into t1(name) values('oscar'); # id=5
'''自增不會隨著資料的刪除而回退'''
delete from t1; # 刪除資料但無法重置主鍵
insert into t1(name) values('jason'),('kevin'),('tony');
truncate t1; # 刪除資料並重置主鍵值
insert into t1(name) values('jason'),('kevin'),('tony');