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"),需要重新分配需要的存儲空間,會造成額外的性能開銷.
CHAR和VARCHAR總是會使用字符編碼的最大長度來作為單位存儲空間,這是為了保證緩存中有足夠的空間來存儲字符串,例如使用UTF8,雖然UTF8是變長字符集(英文1Byte,中文3Byte),但是VARCHAR(10)仍然會占用30Bytes空間,即使里面一個中文字也沒有.
另外,VARCHAR會比原長度額外占用1~2個字節,用來表示字符串的長度,當字符串長度小於255時占用1 Byte, 否則占用 2 Byte
查詢時,CHAR去除末尾空格
WHERE字句比較字符串時,CHAR保留末尾空格
關於二者的效率:
- 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個值,一般可用來表示性別等唯一且范圍固定的屬性(男,女..)