數據庫有一個存儲引擎,針對不同的數據類型,有不同的存儲機制,就像word 打開 doc ,pdf,excel;,為什么能打開,因為他又處理不同數據的能力,而數據庫相反,針對不同的數據,有不同的存儲方式,常見的存儲引擎有,innodb,myasim(我的阿薩姆),memory,blackhole, 有一個方法可以查看sql有哪些存儲引擎, 在創建table時 可以這樣寫,create table t engin = innodb / memory ,簡單的介紹一下這幾個,使用innodb 創建的表,有兩個文件,t.frm 是結構,t.bd 表數據,myaism創建的表,有三個文件,分別.frm / .mvd / MYI ,對應結構,表數據,索引,memory 和 blackhhole ,只有。frm只有結構,innodb 是5.5版本之后默認的,myasim 是5.5之前版本默認的,這兩個都可以很好的存儲數據,而memory 指的是內存存儲,只存儲在內存,斷電就沒有了,blackhole 有黑洞的意思,扔進去就沒有了,這兩個無法保存在硬件上。剛剛學,還是用前兩個。
一 、常見數據類型:有整形、浮點型、字符、日期、枚舉、集合;
1.整形
有 tinyint ( 一個字節,8位) ,smallint(2字節),int(四個字節),bigint(8個字節);
有符號的存儲范圍是 負的2的(位數)次方 到到2的(位數)次方-1,超出范圍,取邊界,-128 到 127 ,你存了1000000,會顯示127(這個是非嚴格模式下),有無符號可以修改,通過create table t2(id int unsigned),unsigned表示無符號,這是約束條件,補充一個表的,完整語法就是,create table t2( 字段名 類型 約束條件 約束條件),比如create table t2(id int unsigned zerofill)約束條件可以加多個。
**MySQL主要存儲引擎**
* Innodb
是MySQL5.5版本及之后默認的存儲引擎
存儲數據更加的安全
* myisam
是MySQL5.5版本之前默認的存儲引擎
速度要比Innodb更快 但是我們更加注重的是數據的安全
* memory
內存引擎(數據全部存放在內存中) 斷電數據丟失
* blackhole
無論存什么,都立刻消失(黑洞)
```python
"""
# 查看所有的存儲引擎
show engines;
# 不同的存儲引擎在存儲表的時候 異同點
create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=blackhole;
create table t4(id int) engine=memory;
# 存數據
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
### 創建表的完整語法
```python
# 語法
create table 表名(
字段名1 類型(寬度) 約束條件,
字段名2 類型(寬度) 約束條件,
字段名3 類型(寬度) 約束條件
)
# 注意
1 在同一張表中字段名不能重復
2 寬度和約束條件是可選的(可寫可不寫) 而字段名和字段類型是必須的
約束條件寫的話 也支持寫多個
字段名1 類型(寬度) 約束條件1 約束條件2...,
create table t5(id); 報錯
3 最后一行不能有逗號
create table t6(
id int,
name char,
# 寬度
一般情況下指的是對存儲數據的限制
create table t7(name char); 默認寬度是1
insert into t7 values('jason');
insert into t7 values(null); 關鍵字NULL
針對不同的版本會出現不同的效果
5.6版本默認沒有開啟嚴格模式 規定只能存一個字符你給了多個字符,那么我會自動幫你截取
5.7版本及以上或者開啟了嚴格模式 那么規定只能存幾個 就不能超,一旦超出范圍立刻報錯 Data too long for ....
"""嚴格模式到底開不開呢?"""
MySQL5.7之后的版本默認都是開啟嚴格模式的
使用數據庫的准則:
能盡量少的讓數據庫干活就盡量少 不要給數據庫增加額外的壓力
# 約束條件 null not null不能插入null
create table t8(id int,name char not null);
"""
寬度和約束條件到底是什么關系
寬度是用來限制數據的存儲
約束條件是在寬度的基礎之上增加的額外的約束
"""
```
### 基本數據類型
整型
* 分類
TINYINT SMALLINT MEDUIMINT INT BIGINT
* 作用
存儲年齡、等級、id、號碼等等
```python
"""
以TINYINT
是否有符號
默認情況下是帶符號的
超出會如何
超出限制只存最大可接受值
"""
create table t9(id tinyint);
insert into t9 values(-129),(256);
# 約束條件之unsigned 無符號
create table t10(id tinyint unsigned);
create table t11(id int);
# int默認也是帶符號的
# 整型默認情況下都是帶有符號的
# 針對整型 括號內的寬度到底是干嘛的
create table t12(id int(8));
insert into t12 values(123456789);
"""
特例:只有整型括號里面的數字不是表示限制位數
id int(8)
如果數字沒有超出8位 那么默認用空格填充至8位
如果數字超出了8位 那么有幾位就存幾位(但是還是要遵守最大范圍)
"""
create table t13(id int(8) unsigned zerofill);
# 用0填充至8位
# 總結:
針對整型字段 括號內無需指定寬度 因為它默認的寬度以及足夠顯示所有的數據了
```
### 嚴格模式
```python
# 如何查看嚴格模式
show variables like "%mode";
模糊匹配/查詢
關鍵字 like
%:匹配任意多個字符
_:匹配任意單個字符
# 修改嚴格模式
set session 只在當前窗口有效
set global 全局有效
set global sql_mode = 'STRICT_TRANS_TABLES';
修改完之后 重新進入服務端即可
```
### 浮點型
* 分類
FLOAT、DOUBLE、DECIMAL
* 作用
身高、體重、薪資
```python
# 存儲限制
float(255,30) # 總共255位 小數部分占30位
double(255,30) # 總共255位 小數部分占30位
decimal(65,30) # 總共65位 小數部分占30位
# 精確度驗證
create table t15(id float(255,30));
create table t16(id double(255,30));
create table t17(id decimal(65,30));
"""你們在前期不要給我用反向鍵 所有的命令全部手敲!!!增加熟練度"""
insert into t15 values(1.111111111111111111111111111111);
insert into t16 values(1.111111111111111111111111111111);
insert into t17 values(1.111111111111111111111111111111);
float < double < decimal
# 要結合實際應用場景 三者都能使用
```
### 字符類型
* 分類
```python
"""
char
定長
char(4) 數據超過四個字符直接報錯 不夠四個字符空格補全
varchar
變長
varchar(4) 數據超過四個字符直接報錯 不夠有幾個存幾個
"""
create table t18(name char(4));
create table t19(name varchar(4));
insert into t18 values('a');
insert into t19 values('a');
# 介紹一個小方法 char_length統計字段長度
select char_length(name) from t18;
select char_length(name) from t19;
"""
首先可以肯定的是 char硬盤上存的絕對是真正的數據 帶有空格的
但是在顯示的時候MySQL會自動將多余的空格剔除
"""
# 再次修改sql_mode 讓MySQL不要做自動剔除操作
set global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
```
#### char與varchar對比
```python
"""
char
缺點:浪費空間
優點:存取都很簡單
直接按照固定的字符存取數據即可
jason egon alex wusir tank
存按照五個字符存 取也直接按照五個字符取
varchar
優點:節省空間
缺點:存取較為麻煩
1bytes+jason 1bytes+egon 1bytes+alex 1bytes+tank
存的時候需要制作報頭
取的時候也需要先讀取報頭 之后才能讀取真實數據
以前基本上都是用的char 其實現在用varchar的也挺多
"""
補充:
進來公司之后你完全不需要考慮字段類型和字段名
因為產品經理給你發的郵件上已經全部指明了
```
### 時間類型
* 分類
date:年月日 2020-5-4
datetime:年月日時分秒 2020-5-4 11:11:11
time:時分秒11:11:11
Year:2020
```python
create table student(
id int,
name varchar(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'egon','1880','1880-11-11','11:11:11','2020-11-11 11:11:11');
```
### 枚舉與集合類型
* 分類
```python
"""
枚舉(enum) 多選一
集合(set) 多選多
"""
```
* 具體使用
```python
create table user(
id int,
name char(16),
gender enum('male','female','others')
);
insert into user values(1,'jason','male'); 正常
insert into user values(2,'egon','xxxxooo'); 報錯
# 枚舉字段 后期在存數據的時候只能從枚舉里面選擇一個存儲
create table teacher(
id int,
name char(16),
gender enum('male','female','others'),
hobby set('read','DBJ','hecha')
);
insert into teacher values(1,'jason','male','read'); 正常
insert into teacher values(2,'egon','female','DBJ,hecha'); 正常
insert into teacher values(3,'tank','others','生蚝'); 報錯
# 集合可以只寫一個 但是不能寫沒有列舉的
```
**總結**
```python
"""
字段類型
嚴格模式
約束條件
not null
zerofill
unsigned