為什麼資料庫有那麼多數據類型?

在MySql資料庫中有很多的數據類型細化,類似於TINYINT ,SMALLINT,MEDIUMINT,INT,BIGINT;TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT...這樣區分的好處是什麼?如果這樣是為了防止數據記錄佔位過多,造成大量的空間浪費,那像VARCHAR這樣變長的數據類型和CHAR這樣的定長數據行分類又有什麼好處?


簡單來說,語言是用來實現某種特定目的的,編程語言也不例外(SQL也是),比如說,在自然語言中,交流信息會比較容易,但在特定領域就會顯得不精準,例如process這個單詞,在不同的領域可以是不同的意思,可以翻譯為:進程,處理,加工,流程等,在不同的領域代表不同的意思,因此限定領域非常重要。

再比如,在自然語言中,同一個字元可能代表完全不通的意思,比如「勉強「,在日語里代表學習(學習的確很勉強:-))

在編程語言中也是如此,數據類型需要用於限定信息的準確性,比如SQL中,你指定一個列名OrderID,憑人的直覺會覺得這類數據就是數字,但計算機並不知道這列的含義,因此就不能夠正確處理該列。

再比如數據「19」,這列是Int值呢?還是一個字元串?還是16進位代表的一個Unicode字元?

如果對這列進行+1操作,那該是數字上加1變為20?還是字元串操作變為191?還是二進位操作變為1A?

通過數據類型限定數據的範圍,相當於加了範圍約束,這種約束有如下好處

1.使用優化的存儲格式,比如INT類型是四位元組,存儲格式為32位二進位字元,而varchar表示 「9999999999」則需要10位元組(甚至更多,取決於DBMS類型)

2.在對該類約束數據實現某些操作就不再會報錯,比如日期類型 『2017-3-28 00:00:00』就可以無障礙的通過內置函數轉換為任何等價形式,比如"28/3/2017" 或者"2017年3月28日 0點"

3.通過數據類型約束可以減少非正常數據的存入,比如INT類型的列不應該存入字元串。


姓名,籍貫,年齡,性別,住址,出生日期。

給個類型就不會浪費寶貴的存儲空間和計算能力。

傳統資料庫就靠對各種類型的欄位不斷優化,在某些方面,還起到了避免插入錯誤的情況。

不過這幾年開始流行文件型資料庫了。欄位類型又不那麼重要了。


純屬mysql的鍋,你看PG就沒那麼多事


推薦閱讀:

測試分散式系統的線性一致性
怎麼求最小函數依賴集?
tidb后面如何面对阿里xdb和polardb?
資料庫設計必須滿足到第三範式嗎?

TAG:MySQL | 資料庫性能 | 資料庫設計 |