SQL基本的數據類型


   數據庫有一個存儲引擎,針對不同的數據類型,有不同的存儲機制,就像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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM