MySQL的數據類型(xíng)和建庫策略
無論是(shì)在小(xiǎo)得可憐的免(miǎn)費數據庫空間或(huò)是大型電子(zǐ)商務網站,合理(lǐ)的(de)設計表結構、充分(fèn)利用空間(jiān)是十分(fèn)必要的。這就要求我們(men)對(duì)數據庫係統的常用數(shù)據類型有充分的認識。下麵我(wǒ)就將我(wǒ)的一點心得寫出來(lái)跟大家(jiā)分享。
一、數字類型。數字類(lèi)型按照(zhào)我的分類方法分為三類:整數類、小數類和數字類。
我所謂的“數字類(lèi)”,就是(shì)指(zhǐ)DECIMAL和NUMERIC,它們(men)是同(tóng)一種類型(xíng)。它嚴格的說(shuō)不是一種數字類(lèi)型,因為他們實際上是將(jiāng)數字以字符串形式保存的(de);他(tā)的值(zhí)的每一(yī)位(包括小數點)占(zhàn)一(yī)個(gè)字節的存儲空間,因此這種類型(xíng)耗費空間比較大。但是它(tā)的一個突出的優點是小(xiǎo)數的位數固定,在運算中(zhōng)不會“失真”,所以比較適合用於“價格(gé)”、“金額”這樣對精度要求不高但(dàn)準確度要求非(fēi)常高的字段。
小數類,即浮點數類(lèi)型,根據精度(dù)的不同,有FLOAT(單精度)和(hé)DOUBLE(雙精度)兩種。它(tā)們(men)的優勢(shì)是精確度,FLOAT可以(yǐ)表示絕對值非(fēi)常(cháng)小(xiǎo)、小(xiǎo)到約 1.17E-38 (0.000...0117, 小數點後麵有37個零)的小數(shù),而DOUBLE更是可(kě)以表示絕對(duì)值小到(dào)約 2.22E-308 (0.000...0222, 小數點後麵有307個零(líng))的小數。FLOAT類型(xíng)和DOUBLE類型占用存儲空間分別是4字節和8字節。如果需要用到小(xiǎo)數的字段,精度要求不(bú)高的,當然用FLOAT了(le)!可是說(shuō)句實在(zài)話,我們“民(mín)用”的(de)數據,哪有要(yào)求精度那麽高的呢?這(zhè)兩種類型至今我(wǒ)沒有用過——我還沒有遇(yù)到適合於使用它們(men)的事例。
用(yòng)的最多的,最值得精打(dǎ)細算的,是整數類型。從隻占一個字節存儲空間的TINYINT到占(zhàn)8個字節的BIGINT,挑選一個“夠用”並且占用存儲空間最小(xiǎo)的類型是設計數據庫時應(yīng)該考慮(lǜ)的。TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT占用存儲空間分(fèn)別為1字節、2字節、3字(zì)節、4字(zì)節和8字節,就無符號(hào)的整數而言,這些類型(xíng)能表示(shì)的最大整(zhěng)數分(fèn)別(bié)為255、65535、16777215、4294967295和18446744073709551615。如果用來保存用戶的年(nián)齡(líng)(舉(jǔ)例來說,數據庫中保存年齡是不可取的),用TINYINT就夠了;九城的《縱橫》裏,各項技(jì)能值(zhí),用SMALLINT也夠了;如(rú)果要用作一個肯定不會(huì)超過16000000行(háng)的表的AUTO_INCREMENT的IDENTIFY字段(duàn),當然用 MEDIUMINT 不用 INT ,試想(xiǎng),每行節(jiē)約一個字節,16000000行可以節約10兆多(duō)呢(ne)!
二、日期時(shí)間類型。
日期和(hé)時間類(lèi)型(xíng)比較簡單(dān),無非是 DATE、TIME、DATETIME、TIMESTAMP和(hé)YEAR等幾個類型。隻對(duì)日期敏感,而對時間沒有要求(qiú)的字段,就用DATE而不用DATETIME是不用說的(de)了(le);單獨使用時間的情況(kuàng)也(yě)時(shí)有發生——使用TIME;但最多用(yòng)到的還是用DATETIME。在(zài)日期時間(jiān)類型(xíng)上沒有什麽文章可做(zuò),這裏就不(bú)再詳(xiáng)述。
三、字(zì)符(串(chuàn))類型。
不要以為(wéi)字符類型(xíng)就是 CHAR !CHAR和VARCHAR的(de)區別在於CHAR是固定長度,隻要你定義一個(gè)字段是CHAR(10),那麽不論你存儲(chǔ)的(de)數據是(shì)否達到(dào)了(le)10個字節(jiē),它都(dōu)要占(zhàn)去10個字節的空間;而VARVHAR則是(shì)可變(biàn)長度的,如果一個字(zì)段可能的值是不(bú)固定長度的(de),我們隻(zhī)知道它(tā)不可能超過10個字符,把它定義(yì)為 VARCHAR(10)是最合算的,VARCHAR 類型(xíng)的實際長(zhǎng)度是它的值的(實際長度+1)。為什麽(me)“+1”呢?這(zhè)一個字節用於(yú)保存實際使用了多大的(de)長度呀(ya)!從(cóng)這個(gè)“+1”中也應該看到,如果一個(gè)字段,它的(de)可能值最長是10個(gè)字符(fú),而多(duō)數(shù)情況下也就(jiù)是用到了10個字符時(shí),用VARCHAR就(jiù)不合算(suàn)了:因為(wéi)在多數情(qíng)況下,實際占用空間是11個字節,比用CHAR(10)還多占用一個字節(jiē)!
舉個例(lì)子(zǐ),就是一個存儲(chǔ)股票名稱和代碼的表,股(gǔ)票名稱絕大部分是四個字的,即8個(gè)字節(jiē);股票代碼,上海的是六位數字,深圳的是四位數字。這些都是固定長(zhǎng)度的(de),股(gǔ)票名稱當然要(yào)用 CHAR(8) ;股票代碼雖然是(shì)不固定長度,但如果使用VARVHAR(6),一(yī)個深(shēn)圳的股票代碼實際占用(yòng)空間是(shì)5個字節,而(ér)一個上海的股票代碼要占用7個字節!考慮到上(shàng)海的股票數目比(bǐ)深(shēn)圳的多,那麽(me)用VARCHAR(6)就不如CHAR(6)合(hé)算了(le)。
雖然一個CHAR或VARVHAR的(de)最大長度可以到255,我認(rèn)為大(dà)於20的CHAR是幾乎用不到的——很少(shǎo)有(yǒu)大(dà)於20個字節長度(dù)的固(gù)定長度的東東吧(ba)?不是固定長(zhǎng)度的就(jiù)用VARCHAR!大(dà)於100的VARCHAR也(yě)是幾乎用不到的——比這更大的用TEXT就好了。TINYTEXT,最大(dà)長度(dù)為255,占用空間也是(shì)(實際長度+1);TEXT,最大長度65535,占用空(kōng)間是(實際長度+2);MEDIUMTEXT,最大(dà)長度(dù)16777215,占用空間是(實(shí)際長度+3);LONGTEXT,最大(dà)長度4294967295,占用空(kōng)間是(實(shí)際長度(dù)+4)。為什麽“+1”?“+2”?“+3”?“+4”?你(nǐ)要(yào)是還不(bú)知道就該打(dǎ)PP了。這些可(kě)以用在論壇啊、新聞(wén)啊(ā),什麽的,用(yòng)來保存文(wén)章的正文。根(gēn)據實際情況(kuàng)的不(bú)同,選擇從小到大的不同類型。
四、枚舉和(hé)集合類型。
枚(méi)舉(ENUM)類型,最多可以定義65535種不(bú)同的字(zì)符串從中做出選擇(zé),隻能並(bìng)且必須選擇其(qí)中(zhōng)一種(zhǒng),占用存儲空間是一個或兩個字節(jiē),由枚舉(jǔ)值的數目決定;集合(hé)(SET)類型(xíng),最多(duō)可以有64個成員,可以選擇(zé)其(qí)中的零個到不限定的多個,占用存儲空間(jiān)是一個到(dào)八個字節,由集合可能的成員數目決定(dìng)。
舉個(gè)例子來說,在SQLServer中,你(nǐ)可以(yǐ)節約到用(yòng)一個Bit類型(xíng)來表示(shì)性(xìng)別(男/女),但(dàn)MySQL沒有(yǒu)Bit,用TINTINT?不,可以用ENUM('帥(shuài)哥','美眉')!隻有(yǒu)兩種選擇(zé),所以隻需一個字節——跟TINYINT一樣大,但卻可以(yǐ)直接用(yòng)字符串'帥哥'和'美眉'來存取(qǔ)。真是太方便(biàn)啦!
好了,MySQL的數據類型介紹(shào)得(dé)差不多,我的建庫策略也隨著介紹數(shù)據(jù)類型介紹(shào)給(gěi)大家一些。但(dàn)這隻是(shì)其中一部分,篇幅有限,不能再細說(shuō);其他的,就靠(kào)各人在對數據類型理解的基礎上,多多實踐、多多討論。
關鍵詞:MySQL,數據類型,建庫策略
閱(yuè)讀本文(wén)後(hòu)您有什(shí)麽感想(xiǎng)? 已有 人給出評價!
- 0
- 0
- 0
- 0
- 0
- 0