11 MySQL 的資料型別(2)
這一小節我們繼續學習 MySQL 資料庫的資料型別上一小節學習了整數型別和浮點型別,本小節介紹日期時間型別和字串型別。
1.日期和時間型別
型別 | 大小 | 格式 | 範圍 |
---|---|---|---|
date | 3位元組 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 |
time | 3-6位元組 | HH::MM:SS[.微秒] | -838:59:59 ~ 838:59:59 |
year | 1位元組 | YYYY | 1901 ~ 2155 |
datetime | 5-8位元組 | YYYY-MM-DD HH:MM:SS[.微秒值] | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 UTC |
timestamp | 4-7位元組 | YYYY-MM-DD HH:MM:SS[.微秒值] | 1970-01-01 00:00:00 ~ 2038-01-19 03:14:07 UTC |
1.1 date
date 型別為日期型別,儲存空間 3個位元組,格式為 “YYYY-MM-DD”,例如 “2020-03-16”,日期的範圍 “1000-01-01 ~ 9999-12-31”,通常只想用來儲存如 “2020-02-02” 這種格式的日期欄位時,可以選擇使用 date 型別。
1.2 time
time 型別為時間型別,儲存空間 3 ~ 6個位元組,格式為 “HH::MM:SS[.微秒]” ,例如 “04:31:22.33”,範圍 “-838:59:59 ~ 838:59:59”,通常只想用來儲存如 “04:31:22.33” 這種格式的時間欄位時,可以選擇使用 time 型別。
1.3 year
year 型別為日期型別,儲存空間 1 個位元組 ,例如 “2020”,範圍 “1901 ~ 2155”,通常只想用來儲存如 “2020” 這種格式的日期欄位時,可以選擇使用 year 型別。
1.4 datetime
datetime 型別為精確時間的日期型別,儲存空間為 5 ~ 8 個位元組,格式為 “YYYY-MM-DD HH:MM:SS[.微秒值]”,例如 “2020-02-02 02:02:02.02”,範圍 “1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 UTC”,通常只想用來儲存如 “2020-02-02 02:02:02.02” 這種格式的日期欄位時,可以選擇使用 datetime 型別。
1.5 timestamp
timestamp 型別儲存了從1970年01月01日午夜以來的秒數,它和 UNIX 時間戳相同,儲存空間 4 ~ 7 個位元組,範圍 “1970-01-01 00:00:00 ~ 2038-01-19 03:14:07 UTC”,timestamp 顯示的值依賴於時區,和 datetime 相比,前者提供的值與時區有關係,後者則保留文字表示的日期和時間。
2.字串型別
型別 | 範圍 | 說明 |
---|---|---|
char | 1~255個字元 | 固定長度 |
varchar | 欄位儲存所佔位元組數不能超過65535位元組 | 可變長度 |
tinytext | 最大長度255位元組 | 可變長度 |
text | 最大長度65535個位元組 | 可變長度 |
mediumtext | 最大長度16777215個位元組 | 可變長度 |
longtext | 最大長度4294967295個位元組 | 可變長度 |
2.1 char
char 型別為定長字串型別,適合儲存很短的字串,或者所有值都接近同一個長度,例如儲存密碼 md5 值,因為它是一個定長的值,對於經常變更的資料,char 比 varchar 更好,因為定長的 char 不容易產生碎片。
2.2 varchar
varchar 型別用於儲存可變長度字串,是最常見的字串資料型別,對於短長度的字串,它比定長的更為節省空間,varchar 節省空間對效能有幫助,varchar 型別的字串有如下特點 :
- 字串列的最大長度比平均長度大;
- 列的更新少,碎片問題較小;
- 使用瞭如 “UTF-8” 字符集,每個字元都使用不同的位元組數來儲存。
2.3 text
text 資料型別家族包括 : tinytext、text、mediumtext、longtext。 MySQL 把每個 text 值當做一個獨立的物件處理。若 text 家族的值太大時,InnoDB 儲存引擎會額外使用儲存區域來進行儲存,通常儲存文章這樣比較長的內容欄位時,可選擇 text 家族型別。
3.列舉值型別
型別 | 範圍 | 說明 |
---|---|---|
enum | 幾何數最大65535 | 列舉值型別,只能插入列表中指定的值 |
3.1 enum
enum 型別為列舉值型別,有時可以使用列舉值替代字串,列舉列可以把一些不重複的字串儲存為一個預定義的集合。 MySQL 在儲存列舉時非常緊湊,會根據列表值的數量壓縮到 1 ~ 2 個位元組,例如 ENUM (‘黃色’,‘黑色’,‘藍色’,‘紫色’),列舉值型別欄位的需求也可以使用 tinyint 型別來替代。
4.二進位制型別
型別 | 範圍 | 說明 |
---|---|---|
tinyblob | 最大長度255位元組 | 可變長度 |
blob | 最大長度65535個位元組 | 可變長度 |
mediumblob | 最大長度16777215個位元組 | 可變長度 |
longblob | 最大長度4294967295個位元組 | 可變長度 |
4.1 blob
blob 資料型別家族包括 :tinybob、blob、mediumblob、longblob。和 text 家族一樣,MySQL 把每個 text 值當做一個獨立的物件處理。若 blob 家族的值太大時,InnoDB 儲存引擎會額外使用儲存區域來進行儲存,blob 型別儲存的是二進位制資料,沒有排序規則或字符集。
5.小結
本小節主要介紹了 MySQL 日期時間型別和字串型別,需要注意的是時間型別 TIME、DATETIME、TIMESTAMP 儲存大小具體取決於微秒值,例如 TIME 型別,當微秒不存在的時候如 “12:12:12” 位元組數為 3 位元組(微秒 0 位元組)"12:12:12.72"表示微秒 2 位,總共4位元組(微秒1位元組),“12:12:12.6173” 表示微秒 4 位,總共 5 位元組(微秒2位元組),“12:12:12.627127” 表示微秒 6 位,總共 6 位元組,微秒位元組位數對錶如下:
微秒位數 | 大小 | 舉例 |
---|---|---|
0 | 0位元組 | 12:12:12 |
1,2 | 1位元組 | 12:12:12.3 或 12:12:12.32 |
3,4 | 2位元組 | 12:12:12.326 或 12:12:12.3653 |
5,6 | 3位元組 | 12:12:12.35812 或 12:12:12.352161 |
另外還需要注意 char 型別是一種固定長度的型別,varchar 則是一種可變長度的型別,它們的區別是:char(M) 型別的資料列裡,每個值都佔用 M 個位元組,如果某個長度小於 M,MySQL 就會在它的右邊用空格字元補足.。