mysql之引擎和表色資料型別
一,資料儲存引擎
什麼是引擎?一個功能的核心部分
引擎可以被分類 而為什麼要分類呢? 需求場景的不同催生了不同的引擎分類
在mysql中,核心功能是儲存資料,涉及到儲存資料的程式碼,就稱之為儲存引擎
根據不同的需求,也有著不同的引擎分類
不同的引擎測試:
建立表時在最後制定引擎名稱 engine = xxxx
比如: create table t1(id int)engine=innodb create table t2(id int not null)engine=csv insert into t1 value(1); insert into t2 value(1);
innoDB 是預設引擎,直接存放於硬碟上,並且支援事務,行鎖,外來鍵
mysiam,csc 都是把資料存放於硬碟上
blackhole 是黑洞引擎,不存放任何資料
memory 把資料存放於記憶體裡面,需要重啟服務端資料才會消失
二,建立表的完整語句
基本結構如下:
creat table 表名 (欄位名稱 資料型別[(長度) 約束條件],欄位名稱 資料型別[(長度) 約束條件].......)
這裡可以新增多個數據
必須存在的值:欄位名,資料型別和表名
可選的:長度和約束條件
(資料型別也是一種約束,所以約束指得是除了資料型別意外的其他規範)
如果新增的資料超過了制定的長度,超出部分就直接丟棄了;
注意:
2.1欄位名,庫名,表名都不能是mysql的關鍵字.
2.2在同一張表中,欄位名是不能相同的
2.3最後一個欄位後不加逗號
三,資料型別
為什麼要講資料分類?
1,為了描述事物更加準確
2,描述取來更加方便
3,節省記憶體空間
3.1整型
分類 tinyint smallint mediumint int bigint
位元組數 1 2 3 4 8
作用:是存放整數的數型別,有id 身份證號 手機號等
測試:預設整型都是有符號的,需要一個二進位制位來儲存符號
給整型加上約束unsigned來表示無符號(如果超出了範圍就存最大的數)(0,255)
如果有符號存的範圍是(-128,127)
上面特性的出現是因為mysql處於非嚴格模式
修改嚴格模式:'檢視當前模式 show variables like "sql_mode"; 修改為嚴格模式 set global sql_mode = "STRICT_TRANS_TABLES";
(如果在嚴格模式下如果超出範圍就會報錯)
強調:對於整型來說,資料型別後的寬度並不是儲存限制,而是顯示限制
所以我們在建立表時,如果欄位採用的是整型型別,完全無需指定顯示寬度,預設的寬度足夠顯示當初存放的完整的資料
顯示時,不夠8位用0填充,如果超出8位則正常顯示
create table t13(id int(10) zerofill);
3.2浮點型:小數型
分類 float double decimal
位元組數 4 8 不確定(手動指定)
float(m,d) double(m,d) decimal(m,d)
長度說明:m:這個浮點型整數體的長度 d:小數部分的長度
例如 float(5,3) 最大值:99.999
區別:
相同點:小數部分的最大長度都是30
不同點:float 和double的最大長度為255,而demcimal的整數部分組大長度是65
精度不同:decimal double float 精度逐漸降低
3.3字串
(1)作用:姓名,地址 等.用於存放一些純文字的資訊
(2)分類
char 定長
varchar 変長
(3)測試:字元的寬度限制單位是字元的個數
create table t12(x char(4)) #超出四個字元則報錯,不足四個字元則用空格補充
create table t13(y varchar(4)) #超過四個字元則報錯,不足四個字元則有幾個存幾個
insert into t12 values('a'); #'a ' insert into t13 values('a'); #'a'
可以檢視存入的值得長度,char 和varchar的長度
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH"; select char_length(x) from t12; #4 select char_length(y) from t13; #1
注意:當你在執行這樣的查詢語句時,mysql會自動將引數末尾的空格去掉,當你在模糊搜尋時要注意定長符,後面可能有空格,%是任意個數的任意字元 _是任意的一個字元
select *from t19 where name like "yh%";
char和varchar的優缺點(在使用起來並沒有很大的區別)
char存取效率高,但是浪費空間 egon alex lxx wxx yx
varchar存取效率低於char,但是節省儲存空間 (1bytes+egon)(1bytes+alex)(1bytes+lxx)
3.3時間和日期
分類: time 時分秒 11:11:11
date 日期(年月日) 1999-01-27
year 年 1999
datetime 日期加時間
timestamp 時間戳
datetime和timestamp都可以表示日期和時間
共同點:時間的存取通過字串型別都可以通過now()函式來插入當前時間
不同之處:年份最大的範圍不同,時間戳可以為空,代表當前時間(時間戳在你更新記錄時會自動更新當前時間)
測試
create table student( id int, name char(16), born_year year, birth date, class_time time, reg_time datetime ); insert into student values(1,'egon','2000','2000-01-27','08:30:00','2013-11-11 11:11:11');
3.4列舉和集合
列舉enum,多選一個
用於描述一個已知範圍的資料(只能是字串),可以通過列舉的序號來插入值,但是隻能選一個
集合 set,多選多
用於描述一堆資料(只能是字串),值可以任意選多個,但必須都在集合當中,也可以用序號來取值(類似於索引),但用序號只能取一個,
測試:
create table teacher( id int, name char(16), sex enum('male','female','others'), hobbies set('play','read','music','piao') );