1、數據存儲引擎mysql
什麼是引擎?sql
一個功能的核心成分數據庫
引擎能夠被分類、爲何要分類?ide
需求場景不一樣催生了不一樣的引擎類別函數
對於mysql測試
核心功能是存儲數據 涉及到存儲數據的代碼 就稱之爲存儲引擎編碼
根據不一樣的需求 也有着不一樣的引擎分類spa
不一樣的引擎測試3d
建立表時在最後指定引擎名稱 engine = xxx
code
create table t1(id int)engine=innodb create table t1(id int not null)engine=csv create table t1(id int)engine=memory create table t1(id int)engine=blackhole insert into t1 value(1); insert into t2 value(1); insert into t3 value(1); insert into t4 value(1);
innodb是默認引擎 由於 它是永久存儲 而且支持事務,行鎖,外鍵
2、建立表的完整語句
create table 表名(字段名稱 數據類型[(長度) 約束條件],字段名稱 數據類型[(長度) 約束條件])
必須的:字段名 數據類型 表名
可選的:長度 約束條件
長度用於設置數據的長度
數據類型也是一種約束
約束指的是除了數據類型外的額外的規範
若是添加的數據超過了指定的長度範圍,超出範圍的就丟棄
注意:字段名 和 表名 庫名 都不能是Mysql的關鍵字好比select from not....
3、數據類型
枚舉 ** 用於描述 一個已知範圍的數據 例如性別: 只有男 女 或其餘 enum("man","woman","other") 總結: 枚舉中只能是字符串類型 添加的數據只能是已經出如今枚舉中的值 你的值只能是其中的一個 你也可使用枚舉值的序號來插入值 從1開始 多選1 集合 ** 用於描述一堆數據 好比你的興趣愛好 set("watch movie","listen music","play game") 總結:集合中的數據 只能是字符串 添加的數據只能是已經出如今集合中的值 你的值能夠是其中的任意幾個 你也可使用枚舉值的序號來插入值 從1開始 可是隻能給一個序號 多選多
*** *** *** ***** *** tinyint smallint mediumint int bigint 字節數:1 2 3 4 8 默認狀況下整型是有符號的 須要用一個二進制位存儲符號 給整型加上 約束 unsigned來表示無符號 若是數據超出範圍就儘量保存最大的 例如 在無符號下 保存256 其實存的255 若是有符號 例如 tinyint 保存-1280 其實存的是-128 是最小值 修改嚴格模式: 以上特性的出現是由於 mysql處於非嚴格模式 查看當前模式 show variables like "sql_mode"; 修改成嚴格模式 set global sql_mode = "STRICT_TRANS_TABLES"; 嚴格模式下 若是值超出範圍就直接報錯,在一些版本中默認就是嚴格模式! 在咱們的正常開發中,咱們應該先判斷數據的正確性,沒有問題在發給數據庫 怎麼選擇: 得根據實際狀況來判斷,可以保存你的數據的最小類型 長度限制對於整型的意義: create table t10(id int(1)); insert into t10 value(454555); select *from t10; 發現這個數也存儲成功 說明 這裏長度指的不是存儲容量限制 而是顯示的寬度 若是你的數據超過了顯示寬度 有幾個顯示幾個 若是不足 則補全到指定長度 得告訴它用什麼來補全 create table t13(id int(10) zerofill); 總結 不是容量限制 而是 顯示寬度 要限制顯示寬度 1.建立表時 給整型加上寬度 2.加上zerofill約束
分類: 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 不一樣點: decimal的總體最大長度65 精度不一樣 double 比 float 精度高 decimal 是準確的 不會丟失精度 如何選擇:你對精確度要求高你就使用 decimal
分類 char 定長字符 varchar 變長字符 char類型的長度是固定 不管你存儲的數據有多長 佔用的容量都同樣 char(3) 存儲的數據爲 "a" 在硬盤保存的數據仍是佔3字符長度 實際保存的是"a " varchar 長度是可變的 存儲的數據有多長就佔用多長 varchar(3) 存儲的數據爲 "a" 在硬盤保存的數據仍是佔1字符長度 實際保存的是"a" yxx exx lxx zxx cx wxx char(3) (1bytes+yx)(1bytes+exx)(1bytes+lx)(1bytes+zxx) varchar(3) 若是是可變長度 則有問題 不知道數據從哪裏開始到哪裏結束 因此須要有一個位置保存數據的長度 vharchar 能支持的最大長度是65535 用於保存數據長度的數據最長兩個bytes 若是是char類型 若是你的數據不足指定長度 就在後面用空格補全 驗證: 使用一個 char_length的函數 能夠查看字符的長度 create table t18(a char(4),b varchar(4)); insert into t18 value("x","x"); select char_length(a),char_length(b) from t18; 兩個字段的長度都爲1 結論: 這是由於 mysql在存儲時 自動加上的空格 對使用者而言是沒有意義的 因此mysql自動幫你處理掉空格了 咱們能夠設置sql模式 來讓它現出原形 set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES" 設置完成後重啓msyql 再次查詢長度 注意: 當你在執行這樣的查詢語句時 mysql會自動將參數末尾的空格去除 select *from t19 where name = "yh" 當你在使用模糊搜索時 要注意 定長字符 後面可能會有空格 因此最好在後面加上百分號 % select *from t19 where name like "yh"; % 任意個數的任意字符 _ 1個任意字符 如何選擇 char 存取效率高 浪費存儲空間 varchar 存取效率低於char 節省存儲空間 使用起來感覺不到區別 一般用的是char char和varchar 長度都比較小 最大就是65535 大文本類型: TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT 文本是帶有編碼 BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符數據 可是不帶編碼 二進制類型: 用於存儲多媒體數據 好比視頻 可是咱們通常不會將多媒體數據存到數據 而是存儲文件路徑地址 BINARY系列 BINARY VARBINARY 存儲二進制數據
分類 time 時分秒 HH:MM:SS *** year 年份 *** date 日期 年月日 *** datetime 日期加時間 年月日 時分秒 年份最大是9999 ***** timestamp 時間戳 從1970-1-1開始算 年份最大是2037 ***** 共同點: 時間的存取經過字符串類型 均可以使用now()函數來插入當前時間 datetime 和 時間戳都可以表示日期和時間 不一樣之處是: 年份最大範圍不一樣 時間戳能夠爲空 表明當前時間 時間戳在你更新記錄時 會自動更新爲當前時間