MYSQL資料型別長度 常規的建庫策略

2021-04-12 16:31:25 字數 2610 閱讀 4833

無論是在小得可憐的免費資料庫空間或是大型電子商務**,合理的設計表結構、充分利用空間是十分必要的。這就要求我們對資料庫系統的常用資料型別有充分的認識。下面我就將我的一點心得寫出來跟大家分享。

一、數字型別

數字型別按照我的分類方法分為三類:整數類、小數類和數字類。

我所謂的「數字類」,就是指decimal和numeric,它們是同一種型別。它嚴格的說不是一種數字型別,因為他們實際上是將數字以字串形式儲存的;他的值的每一位(包括小數點)佔乙個位元組的儲存空間,因此這種型別耗費空間比較大。但是它的乙個突出的優點是小數的位數固定,在運算中不會「失真」,所以比較適合用於「**」、「金額」這樣對精度要求不高但準確度要求非常高的字段。

小數類,即浮點數型別,根據精度的不同,有float(單精度)和double(雙精度)兩種。它們的優勢是精確度,float可以表示絕對值非常小、小到約 1.17e-38 (0.000...0117, 小數點後面有37個零)的小數,而double更是可以表示絕對值小到約 2.22e-308 (0.000...0222, 小數點後面有307個零)的小數。float型別和double型別占用儲存空間分別是4位元組和8位元組。如果需要用到小數的字段,精度要求不高的,當然用float了!可是說句實在話,我們「民用」的資料,哪有要求精度那麼高的呢?這兩種型別至今我沒有用過——我還沒有遇到適合於使用它們的事例。

用的最多的,最值得精打細算的,是整數型別。從只佔乙個位元組儲存空間的tinyint到佔8個位元組的bigint,挑選乙個「夠用」並且占用儲存空間最小的型別是設計資料庫時應該考慮的。tinyint、**allint、mediumint、int和bigint占用儲存空間分別為1位元組、2位元組、3位元組、4位元組和8位元組,就無符號的整數而言,這些型別能表示的最大整數分別為255、65535、16777215、4294967295和18446744073709551615。如果用來儲存使用者的年齡(舉例來說,資料庫中儲存年齡是不可取的),用tinyint就夠了;九城的《縱橫》裡,各項技能值,用**allint也夠了;如果要用作乙個肯定不會超過16000000行的表的auto_increment的identify欄位,當然用 mediumint 不用 int ,試想,每行節約乙個位元組,16000000行可以節約10兆多呢!

二、日期時間型別

日期和時間型別比較簡單,無非是 date、time、datetime、timestamp和year等幾個型別。只對日期敏感,而對時間沒有要求的字段,就用date而不用datetime是不用說的了;單獨使用時間的情況也時有發生——使用time;但最多用到的還是用datetime。在日期時間型別上沒有什麼文章可做,這裡就不再詳述。

三、字元(串)型別

不要以為字元型別就是 char!char和varchar的區別在於char是固定長度,只要你定義乙個欄位是char(10),那麼不論你儲存的資料是否達到了10個位元組,它都要占去10個位元組的空間;而varvhar則是可變長度的,如果乙個字段可能的值是不固定長度的,我們只知道它不可能超過10個字元,把它定義為 varchar(10)是最合算的,varchar 型別的實際長度是它的值的(實際長度+1)。為什麼「+1」呢?這乙個位元組用於儲存實際使用了多大的長度呀!從這個「+1」中也應該看到,如果乙個字段,它的可能值最長是10個字元,而多數情況下也就是用到了10個字元時,用varchar就不合算了:因為在多數情況下,實際占用空間是11個位元組,比用char(10)還多占用乙個位元組!

舉個例子,就是乙個儲存**名稱和**的表,**名稱絕大部分是四個字的,即8個位元組;****,上海的是六位數字,深圳的是四位數字。這些都是固定長度的,**名稱當然要用char(8 );****雖然是不固定長度,但如果使用varvhar(6),乙個深圳的****實際占用空間是5個位元組,而乙個上海的****要占用7個位元組!考慮到上海的**數目比深圳的多,那麼用varchar(6)就不如char(6)合算了。

雖然乙個char或varvhar的最大長度可以到255,我認為大於20的char是幾乎用不到的——很少有大於20個位元組長度的固定長度的東東吧?不是固定長度的就用varchar!大於100的varchar也是幾乎用不到的——比這更大的用text就好了。tinytext,最大長度為255,占用空間也是(實際長度+1);text,最大長度65535,占用空間是(實際長度+2);mediumtext,最大長度16777215,占用空間是(實際長度+3);longtext,最大長度4294967295,占用空間是(實際長度+4)。為什麼「+1」?「+2」?「+3」?「+4」?你要是還不知道就該打pp了。這些可以用在論壇啊、新聞啊,什麼的,用來儲存文章的正文。根據實際情況的不同,選擇從小到大的不同型別。

四、列舉和集合型別

列舉(enum)型別,最多可以定義65535種不同的字串從中做出選擇,只能並且必須選擇其中一種,占用儲存空間是乙個或兩個位元組,由列舉值的數目決定;集合(set)型別,最多可以有64個成員,可以選擇其中的零個到不限定的多個,占用儲存空間是乙個到八個位元組,由集合可能的成員數目決定。

舉個例子來說,在sqlserver中,你可以節約到用乙個bit型別來表示性別(男/女),但mysql沒有bit,用tintint?不,可以用enum(帥哥,美眉)!只有兩種選擇,所以只需乙個位元組——跟tinyint一樣大,但卻可以直接用字串帥哥和美眉來訪問。真是太方便啦!

好了,mysql的資料型別介紹得差不多,我的建庫策略也隨著介紹資料型別介紹給大家一些。但這只是其中一部分,篇幅有限,不能再細說;其他的,就靠各人在對資料型別理解的基礎上,多多實踐、多多討論。 

MySQL資料型別的長度

mysql有幾種資料型別可以限制型別的 長度 有char length varchar length tinyint length smallint length mediumint length int length bigint length float length,decimals doub...

mysql 長度 含義 mysql資料型別長度

1個位元組 8位 tinyint 為乙個位元組 2的8次方 256 所以最多儲存到256 日期和時間資料型別 mysql資料型別 含義date 3位元組,日期,格式 2014 09 18 time 3位元組,時間,格式 08 42 30 datetime 8位元組,日期時間,格式 2014 09 1...

mysql中資料型別的長度

因為最近要登記一些長度較大的數值,今天才仔細的檢視了bigint的範圍。以前都忽略了mysql中資料長度的上限問題。在mysql中建立表時,varchar型別必須指定長度,int型別可以不指定長度。當然,在mysql中使用介面建立表 不使用sql語句建立表 若不指定長度,它會為你指定預設長度,下面對...