1.整數
TINYINT: 8 bit 儲存空間
SMALLINT: 16 bit 儲存空間
MEDIUMINT: 24 bit 儲存空間
INT: 32 bit 儲存空間
BIGINT: 64 bit 儲存空間
分為
SIGNEN: 有符整數,可儲存正數和負數,如 TINYINT SIGNED 表示的範圍是 -127 ~ 128
UNSIGNED: 無符整數,只能儲存正數,但是表示的值是有符整數的兩倍, 如 TINYINT UNSIGNED 表示的範圍是 0 ~ 255
有符整數和無符整數只有表示的值大小上的區別,儲存空間和效率上都是一樣的
2.實數
DECIMAL: 可表示比 BIGINT 還大的正數,儲存時可以指定整數長度和小數位元,如 DECIMAL(18, 9) 表示總長18位,小數點後9位,一共佔用9 Byte,小數點前4 Byte,小數點1 Byte, 小數點後4 Byte, 一般用於儲存精確資料,如銀行賬目
FLOAT: 32 bit, 0~23精度
DOUBLE: 64 bit, 24~53精度
DOUBLE和FLOAT比起DECIMAL,佔用的儲存更少,但是精度沒有DECIMAL高
3.字串
3.1 CHAR和VARCHAR
CHAR:
定長字串,最大長度為255,mysql會分配固定的儲存空間來儲存CHAR,一般來講用在需要經常執行長度經變化的UPDATE,但最大長度和平均長度相近的列上
CHAR在擷取值時,會將末尾空格刪除,但是在比較值時,末尾的空格則會儲存,效果參見
VARCHAR:
變長字串,最大長度為65535,mysql會分配字串實際長度的空間來儲存VARCHAR,一般來講用在不需要經常執行列值長度變化的UPDATE,但是最大長度又遠大於平均長度的列上,因為當列值的長度變化時(例如某列從"Jack" => "I want to gank"),需要重新分配需要的儲存空間,會造成額外的效能開銷.
另外,VARCHAR會比原長度額外佔用1~2個位元組,用來表示字串的長度,當字串長度小於255時佔用1 Byte, 否則佔用 2 Byte
查詢時,CHAR去除末尾空格
WHERE字句比較字串時,CHAR保留末尾空格
關於二者的效率:
- SELECT時,CHAR的效率會高於VARCHAR的效率,因為在尋找時CHAR是定長的,尋找資料可以很快的計算出資料的位置,如CHAR(10),第五個資料的地址就是5*10這樣,而VARCHAR因為定長,所以計算資料地址需要耗費額外的時間
- UPDATE時,CHAR的效率會高於VARCHAR的效率,因為VARCHAR是不定長的,當資料長度改變時,需要重新分配儲存空間
3.2 BLOB和TEXT
BLOB和TEXT的唯一區別是BLOB儲存二進位類型而且沒有字元集好定序,而TEXT儲存字元文本,且有字元集和定序
它們的定序按照 max_short_length 規定長度的前若干個字元進行排序
4.日期和時間類型
DATETIME: 將日期儲存為YYYYMMDDHHMMSS格式,範圍從1001 ~ 9999年,佔用空間 8 Byte
TIMESTAMP: 將日期儲存為Unix時間戳記,範圍從1970 ~ 2038年, 佔用空間 4Byte,並且和時區相關,它的特性是當插入沒有定義TIMESTAMP的列時,MySQL會自動將時間戳記儲存為目前時間,所以一般可用於記錄最後登入時間等.
5.位集資料類型
BIT: 最大 64 bit,一般用於儲存一個true/false值,如BIT(1),佔用 1 bit,遠小於使用字元表示
SET: 用於儲存多個true/false值,可用於許可權管理,效果見
6.枚舉
ENUM: 類似於SET,但是只能插入1個值,一般可用來表示性別等唯一且範圍固定的屬性(男,女..)