1. 程式人生 > >mysql之引擎和表色資料型別

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') );