數據庫之字段類型


一:數據庫基礎

【1】存儲引擎:不同的數據類型對應不同的處理機制

(1)innodb:默認存儲引擎 相比於myisam來說 讀取速度較慢

(2)myisam:5.1之前用的版本 對數據的操控安全性不如innodb

(3)memory:臨時存儲引擎 數據存入內存 斷電數據消失

(4)blackhole:黑洞引擎 無論存放什么數據 都會立馬消失

# 查看存儲引擎
show engines;

create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;

insert into t1 values(1);
insert into t2 values(2);
insert into t3 values(3);
insert into t4 values(4);

 

圖解一:

Innodb:支持事務 行鎖 外鍵 在安全性上比myisam更加高

 

圖解二:

t1:

(1)frm:表結構

(2)ibd:真實存放的數據

t2:

frm:表結構

MYD:真實存放的數據

MYI:索引

PS:因為其有索引 所以查找數據速度比較快

t3/t4:

(1)frm:表結構

 

【1】創建表的完整語法結構

(1)語法 create table 表名(字段名 類型(寬度 約束條件),字段名 類型(寬度 約束條件));

PS:

(1)字段名 和類型必須要寫

(2)寬度值和約束條件可寫可不寫

(3)字段名之間不能重復

(4)字段名最后一個千萬不能加上逗號 

例如:

create table userinfo(id int,name char);

 

(2)約束條件

寬度:

(1)作用:限制數據的存儲位數

PS:

(1)當數據超出存儲位數 會按照從左到右截斷數據

(2)如果在嚴格模式下 超出數據位數會直接報錯

例如:

insert into userinfo(name) values('SR');   # 插入數據
select name from userinfo;  # S

PS:上述插入char寬度默認為1位 所以只能插入一個S

(1)對於整型來說寬度不是用來限制存儲的個數 而是用來限制展示出來的個數

(2)如果超過寬度則直接顯示出來 如果小於寬度則以0補齊寬度

(3)只要是整型 都不需要指定寬度 因為有默認的寬度(默認寬度為11位 而int最大數據長度為10位) 足夠顯示對應的數據

 

(2)條件約束:

not null不能為空

create table userinfo(name char(16));

alter table userinfo modify name char not null

insert into userinfo values(null);  # 報錯

PS:

(1)字段類型約束的是數據從存儲類型

(2)約束條件是在對字段類型之上在進行約束

 

二:字段類型

 (1)整形:TINYINT,SMALLINT, MEDIUMINT ,INT

TINYINT:

符號:默認有符號的

超出范圍:會自動將值換成最先值或者最大值

例如:

create table t1(id TINYINT);
insert into t1 values(-129),(128);  # (-128),(127

PS:如果有符號范圍為(-128,127)

 

int

符號:默認有符號的

超出范圍:會自動將值換成最先值或者最大值

例如:

create table t2(id int);
insert into t2 values(-2222222222222222222),(222222222222222222222);  # (-2147483648,2147483647

PS:SMALLINT, MEDIUMINT 與上述情況一樣

 

unsigned :

作用:將上述整形由默認帶符號變成無符號

符號:無符號

范圍:如果超出范圍最小值為0 最大值為255

例如:

create table t4(id TINYINT unsigned);
insert into t4 values(-129),(256);  # (0,255

 

 (2)浮點型:

 (1)float(255,30) 總共255位 小數部分占30位
 (2)double(255,30) 總共255位 小數部分占30位
 (3)decimal(65,30) 總共65位 小數部分占30位

例如:

create table t9(x float(255,30));
create table t10(x double(255,30));
create table t11(x decimal(65,30));

insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);

PS:精准度 float < double < decimal

 

(3)字符類型(char):

char:后面的數字是限制存儲的數據長度的

 例如:

create table t5(name char);
insert into t5 values('SR');  # S

PS:上述存放5位數據 但是由於char默認只能存一位 所以最終在數據庫中存入S

嚴格模式:

產生背景:

(1)對於上述例子中 雖然位數不夠 其會幫我們截斷進行存入數據庫

(2)但是截斷需要消耗數據庫的操作 增大數據的壓力

(3)而且截斷的存入的數據 本身也不是我們所需要的數據

作用:

(1)可以通過設置嚴格模式 如果不符合我設置的規則 則會報錯

# 查看嚴格模式
show variable like '%mode%' # 模糊匹配 like % 匹配任意多個字符 _ 匹配一個字符 set session 臨時有效 只在你當前操作的窗口有效 set global 全局有效 終生有效 # 修改模式為嚴格模式 set global sql_mode = 'STRICT_TRANS_TABLES';

PS:上述模式修改之后 一定要重新打開窗口

create table t6(name char);
insert into t6 values('SR');   # 報錯

 

char(寬度):寬度限制存放位數 如果超過則直接報錯 如果不夠自動用空格填充

varchar(寬度):寬度限制存放位數 如果超過則直接報錯 有幾個存幾個

create table t8(name char(10));
insert into t8 values('mysql');

create table t9(name varchar(10));
insert into t9 values('mysql');

# 查看某字段的長度
select char_length(name) from t8
select char_length(name) from t9

PS:

(1)在查看上述數據的時候 在取出來的時候sql會自動將空格給去除

(2)通過嚴格機制 修改不讓取出來的時候 空格被去除

set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";

PS:一定在以前修改的尾部追加 如果不追加則會將原來的覆蓋

char:

(1)浪費存儲空間 因為不夠加上空格符

(2)存取速度快

 

varchar:

(1)節省內存空間

(2)存儲速度慢

  (1)存儲時候:添加一個固定包頭

  (2)讀取時候:讀取固定長度包頭 由包頭告訴真實數據

 

(4)時間類型:

date:年月日

datetime:年月日時分秒

time:時分秒

year:年

例如:

create table student(
    id int,
  name char(16),
  born_year year,
  birth date,
  study_time time,
  reg_time datetime
);
insert into student values(1,'SR','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');

 

(5)枚舉:

作用:限制某個字段存放的數據

PS:多選一

例如:

create table user(
    id int,
  name char(16),
  gender enum('male','female','others')
);
insert into user values(1,'jason','xxx')  # 報錯
insert into user values(2,'egon','female')  # 正確!

集合:

作用:限制某個字段存放的數據

PS:多選多

例如:

create table teacher(
    id int,
  name char(16),
  gender enum('male','female','others'),
  hobby set('read','sleep','sanna','dbj')
);
insert into teacher values(1,'egon','male','read,sleep,dbj')  # 集合也可以只存一個

 

(6)約束條件:

not null + default

例如:

create table user(
    id int,
  name char(16)
);
insert into user values(1,null)  # 可以修改

alter table user modify name char(16) not null;
insert into user(name,id) values(null,2);  # 報錯 插入數據可以在表名后面指定插入數據對應的字段

create table student(
    id int,
  name char(16) not null,
  gender enum('male','female','others') default 'male'
)
insert into student(id,name) values(1,'jason')  # 成功

 

(7)unique:

作用:限制某個字段是唯一的 不能重復

(1)單列唯一:

例如:

# 單列唯一
create table user1(
    id int unique, 
  name char(16)
);
insert into user1 values(1,'jason'),(1,'egon')  # 報錯
insert into user1 values(1,'jason'),(2,'egon')  # 成功
# 聯合唯一
create table server(
    id int,
  ip char(16),
  port int,
  unique(ip,port)
)
insert into server values(1,'127.0.0.1',8080);
insert into server values(2,'127.0.0.1',8080);  # 報錯
insert into server values(1,'127.0.0.1',8081);

PS:聯合唯一 一定要在字段的末尾

 

(8)primary key:

作用:

(1)從約束條件看 其等於  not all + unique

例如:

create table t11(id int primary key);insert into t11 values(1),(1);  # 報錯
insert into t11 values(1),(2);

(2)其還是innodb搜索的索引

PS:

(1)innodb在創建表的時候 必須要有一個主鍵

(2)當沒有創建主鍵的時候 其會按照代碼從上到下搜索將非空且唯一的字段設置成unique

(3)當上述條件都不滿足 innodb會采用自己內部的一個主鍵字段充當主鍵 (該主鍵在查詢的時候無法使用 導致innodb無法通過索引取值)

例如:

create table t12(
    id int,
  name char(16),
  age int not null unique,
  addr char(16) not null unique
)engine=innodb;

 

(7)auto_increment:

作用:主鍵編號自動遞增

例如:

create table t13(
    id int primary key auto_increment,
  name char(16)
);
insert into t13('jason'),('jason'),('jason');

PS:我們一般設置ID為我們的主鍵 因為ID一般用來標識一個數據的編號

 

delete from tb1;

作用:其可以將表中的某些數據刪除 但是不會將主鍵的ID給重置為0

 

truncate:

作用:其會清空所有的數據 主鍵ID也會被重置為0

 


免責聲明!

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



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