引言 MySQL中定義數據欄位的類型對你資料庫的優化是非常重要的。 MySQL支持多種類型,大致可以分為三類:數值、日期/時間和字元串(字元)類型,如下腦圖所示: 數值類型 其中: 這些類型,是定長的,其容量是不會隨著後面的數字而變化的,比如int(11)和int(8),都是一樣的占4位元組。tiny ...
引言
MySQL中定義數據欄位的類型對你資料庫的優化是非常重要的。
MySQL支持多種類型,大致可以分為三類:數值、日期/時間和字元串(字元)類型,如下腦圖所示:
數值類型
類型 | 大小 | 範圍(有符號) | 範圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 位元組 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 位元組 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 位元組 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 位元組 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 位元組 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
FLOAT | 4 位元組 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度 浮點數值 |
DOUBLE | 8 位元組 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
其中:
這些類型,是定長的,其容量是不會隨著後面的數字而變化的,比如int(11)和int(8),都是一樣的占4位元組。tinyint(1)和tinyint(10)也都占用一個位元組。
那麼後面的11和8,有啥用呢。
數據類型(m)中的m不是表示的數據長度,而是表示數據在顯示時顯示的最小長度。tinyint(1) 這裡的1表示的是 最短顯示一個字元。tinyint(2) 這裡的2表示的是 最短顯示兩個字元。
當字元長度(m)超過對應數據類型的最大表示範圍時,相當於啥都沒發生;
當字元長度(m)小於對應數據類型的表示範圍時,就需要指定拿某個字元來填充,比如zerofill(表示用0填充),
設置tinyint(2) zerofill 你插入1時他會顯示01;設置tinyint(4) zerofill 你插入1時他會顯示0001。
即使你建表時,不指定括弧數字,mysql會自動分配長度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
DECIMAL(M,D)表示列可以存儲D
位小數的M位數。十進位列的實際範圍取決於精度和刻度。例如decimal(5,2) -- 取值範圍是 -999.99 到 999.99
- 整數的位數必須小於等於m-d,不然報錯。小數的位數可以大於d位。多出d位時會做四捨五入,截取到d位。
- 以上均不包括小數點、符號的位數。數字的總長度是m位,保存後的小數位最多是d位。如果保存後是整數,小數位不會補0。
日期和時間類型
類型 | 大小 (位元組) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 |
1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
字元串類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255位元組 | 定長字元串 |
VARCHAR | 0-65535 位元組 | 變長字元串 |
TINYBLOB | 0-255位元組 | 不超過 255 個字元的二進位字元串 |
TINYTEXT | 0-255位元組 | 短文本字元串 |
BLOB | 0-65 535位元組 | 二進位形式的長文本數據 |
TEXT | 0-65 535位元組 | 長文本數據 |
MEDIUMBLOB | 0-16 777 215位元組 | 二進位形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215位元組 | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295位元組 | 二進位形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295位元組 | 極大文本數據 |
char的列長度是固定的,char的長度可選範圍在0-255字元之間。也就是char最大能存儲255個字元。
varchar的列長度是可變的,在mysql5.0.3之前varchar的長度範圍為0-255字元,mysql5.0.3之後varchar的長度範圍為0-65535個位元組。
CHAR(M)定義的列的長度為固定的,M取值可以為0-255之間,當保存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格被刪除掉。在存儲或檢索過程中不進行大小寫轉換。CHAR存儲定長數據很方便,CHAR欄位上的索引效率級高,比如定義char(10),那麼不論你存儲的數據是否達到了10個字元,都要占去10個字元的空間,不足的自動用空格填充。
VARCHAR(M)定義的列的長度為可變長字元串,VARCHAR的最大有效長度由最大行大小和使用的字元集確定。整體最大長度是65,532位元組。VARCHAR值保存時不進行填充。當值保存和檢索時尾部的空格仍保留,符合標準SQL。varchar存儲變長數據,但存儲效率沒有CHAR高。如果一個欄位可能的值是不固定長度的,我們只知道它不可能超過10個字元,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什麼"+1"呢?這一個位元組用於保存實際使用了多大的長度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。
簡單來說:varchar(m)裡面表示的是長度,例如:varchar(5)表示最大可存儲5個中文或5個英文字母。
總結
資料庫作為程式的核心,設計的好壞,直接影響系統的性能,因此要不斷總結學習,設計符號標準的、穩定的、可靠的資料庫。