數據類型用來指定一定的存儲格式、約束和有效範圍。MySQL支持的數據類型非常多,主要包括數值型、字符串類型、日期和時間類型。
選擇正確的數據類型對於獲得高性能至關重要。
一、數值類型
1.整數類型
整數類型 | 字節 | 最小值 | 最大值 |
---|---|---|---|
TINYINT | 1 | 有符號-128、無符號0 | 有符號127 無符號255 |
SMALLINT | 2 | 有符號-32768、無符號0 | 有符號32767 無符號65535 |
MEDIUMINT | 3 | 有符號-8388608、無符號0 | 有符號8388607、無符號1677215 |
INT、INTEGER | 4 | 有符號-2147483648、無符號0 | 有符號2147483647、無符號4294967295 |
BIGINT | 8 | 有符號-9223372036854775808、無符號0 | 有符號9223372036854775807、無符號18446744073709551615 |
- 每種整數類型都有取值範圍,超出類型範圍的操作會導致"out of range"錯誤提示。
- 整型數據,MySQL還支持在類型名稱後面的小括號內指定顯示寬度,如int(5)表示當數值寬度小於5時在數字前面填滿寬度,如果不顯示指定寬度則默認爲int(11)。一般配合zerofill使用,顧名思義,zerofill就是用"0"填充的意思,在數字位數不夠的空間用字符"0"填滿。寬度格式不會對實際數據有任何影響,還是按照類型的實際精度進行保存。
- 如果一個列指定爲zerofill,則MySQL自動爲該列添加UNSIGNED屬性。
2.浮點數類型
對於小數的表示, MYSQL分爲兩種方式:浮點數和定點數。浮點數包括 float(單精度)和 double(雙精度),而定點數則只有decimal一種表示。定點數在內部以字符串形式存放,比浮點數更精確,適合用來表示貨幣等精度高的數據。
浮點數和定點數都可以用類型名稱後加“(M,D)”的方式來進行表示,“(M,D)”表示該值一共顯示M位數字(整數位+小數位),其中D位位於小數點後面,M和D又稱爲精度和標度。例如,定義爲 float(7,4)的一個列可以顯示爲-999.9999。MySQL保存值時進行四捨五入,因此如果在float(7,4) 列內插入9.00009,近似結果是999.0001。值得注意的是,浮點數後面跟“(M,D)”的用法是非標準用法,如果要用於數據庫的遷移,則最好不要這麼使用。 float和 double在不指定精度時,默認會按照實際的精度由實際的硬件和操作系統決定)來顯示,而 decimal在不指定精度時,默認的整數位爲10,默認的小數位爲0。
浮點數類型 | 字節 | 最小值 | 最大值 |
---|---|---|---|
FLOAT | 4 | ±1.175494351E-38 | ±3.402823466E+38 |
DOUBLE | 8 | ±2.2250738585072014E-308 | ±1.7976931348623157E+308 |
DEC(M,D), DECIMAL(M,D) | M+2 | 最大範圍與double相同,給定decimal的有效取值範圍由M和D決定 |
3.位類型
BIT(M)類型,用於存放位字段值,BIT(M)可以用來存放多位二進制數,M範圍從1~64,如果不寫則默認爲1位。
位類型 | 字節 | 最小值 | 最大值 |
---|---|---|---|
BIT(M) | 1~8 | BIT(1) | BIT(64) |
二、日期時間類型
日期和時間類型 | 字節 | 零值表示 | 最小值 | 最大值 |
---|---|---|---|---|
DATE | 4 | 0000-00-00 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 0000-00-00 00:00:00 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 00000000000000 | 19700101080001 | 2038年的某個時刻 |
TIME | 3 | 00:00:00 | -838:59:59 | 838:59:59 |
YEAR | 1 | 0000 | 1901 | 2155 |
三、字符串類型
字符串類型 | 字節 | 描述及存儲需求 |
---|---|---|
CHAR(M) | M | M爲0~255之間的整數 |
VARCHAR(M) | M爲0~65536之間的整數,值得長度+1個字節 | |
TINYBLOB | 允許長度0~255字節,值得長度+1個字節 | |
BLOB | 允許長度0~65535字節,值得長度+2個字節 | |
MEDUIMBLOB | 允許長度0~167772150字節,值得長度+3個字節 | |
LONGBLOB | 允許長度0~4294967295,值得長度+4個字節 | |
TINYTEXT | 允許長度0~255字節,值得長度+2個字節 | |
TEXT | 允許長度0~65535字節,值得長度+2個字節 | |
MEDIUMTEXT | 允許長度0~167772150字節,值得長度+3個字節 | |
LONGTEXT | 允許長度0~4294967295字節,值得長度+4個字節 | |
VARBINARY(M) | 允許長度0~M個字節的邊長字節字符集,值得長度+1個字節 | |
BINARY(M) | M | 允許長度0~M個字節的定長字節字符集 |
- char和varchar很類似,都用來保存MySQL中較短的字符串。
- char列的長度固定爲創建表時聲明的長度,長度可以是0~255的數值。
- char列刪除尾部的空格,varchar則保留尾部的空格。
- char適合存儲很短的字符串,或者所有值都接近同一個長度。對於經常變更的數據char也比varchar更好,因爲定長的char不容易產生碎片。
- varchar適合於:字符串列的最大長度比平均長度大很多;列的更新很少所以碎片問題可忽略;使用了像UTF-8這樣複雜的字符集,每個字符使用不同的字節數進行存儲。