MySQL數(shù)據(jù)庫的varchar類型在5.0.3以下的版本中的最大長度限制為255,其數(shù)據(jù)范圍可以是0~255。
在MySQL5.0.3及以上的版本中,varchar數(shù)據(jù)類型的長度支持到了65535,也就是說可以存放65532個字節(jié)的數(shù)據(jù),起始位和結(jié)束位占去了3個字節(jié),也就是說,在5.0.3以下版本中需要使用固定的TEXT或BLOB格式存放的數(shù)據(jù)可以在高版本中使用可變長的varchar來存放,這樣就能有效的減少數(shù)據(jù)庫文件的大小。
如果在varchar中寫入大于設(shè)定的長度,默認情況下會截去后面的部分。
VARCHAR類型
VARCHAR類型用于存儲可變長字符串,是最常見的字符串數(shù)據(jù)類型。它比定長類型更節(jié)省空間,因為它僅使用必要的空間(例如,越短的字符串使用越少的空間)。有一種情況例外,如果MySQL表使用ROW_FORMAT=FIXED創(chuàng)建的話,每一行都會使用定長存儲,這會很浪費空間。
VARCHAR需要使用1或2個額外字節(jié)記錄字符串的長度:如果列的最大長度小于或等于255字節(jié),則只使用1個字節(jié)表示,否則使用2個字節(jié)。假設(shè)采用latin1字符集,一個VARCHAR(10)的列需要11個字節(jié)的存儲空間。VARCHAR(1000)的列則需要1002個字節(jié),因為需要2個字節(jié)存儲長度信息。
VARCHAR節(jié)省了存儲空間,所以對性能也有幫助。但是,由于行是變長的,在UPDATE時可能使行變得比原來更長,這就導(dǎo)致需要做額外的工作。如果一個行占用的空間增長,并且在頁內(nèi)沒有更多的空間可以存儲,在這種情況下,不同的存儲引擎的處理方式是不一樣的。例如,MyISAM會將行拆成不同的片段存儲,InnoDB則需要分裂頁來使行可以放進頁內(nèi)。其他一些存儲引擎也許從不在原數(shù)據(jù)位置更新數(shù)據(jù)。
VARCHAR適用情況
下面這些情況下適用VARCHAR是合適的:
字符串列的最大長度比平均長度大很多
列的更新很少,所以碎片不是問題
使用了像UTF-8這樣復(fù)雜的字符集,每個字符都使用不同的字節(jié)數(shù)進行存儲
CHAR類型
CHAR類型是定長的:MySQL總是根據(jù)定義的字符串長度分配足夠的空間。當存儲CHAR值時,MySQL會刪除所有的末尾空格。CHAR值會根據(jù)需要采用空格進行填充以方便比較。
CHAR適合存儲很短的字符串,或者所有值都接近同一個長度。例如,CHAR非常適合存儲密碼的MD5值,因為這是一個定長的值。對于經(jīng)常變更的數(shù)據(jù),CHAR也比VARCHAR更好,因為定長的CHAR類型不容易產(chǎn)生碎片。對于非常短的列,CHAR比VARCHAR在存儲空間上也更有效率。例如用CHAR(1)來存儲只有Y和N的值,如果采用單字節(jié)字符集只需要一個字節(jié),但是VARCHAR(1)卻需要兩個字節(jié),因為還有一個記錄長度的額外字節(jié)。
VARCHAR(5)與VARCHAR(200)的區(qū)別
我們倘若用VARCHAR(5)和VARCHAR(200)來存儲'hello',我們知道這兩者的空間開銷是一樣的。那么我們可以讓VARCHAR的長度始終保持很大嗎?使用更短的列有什么優(yōu)勢嗎?
事實證明有很大的優(yōu)勢。更長的列會消耗更多的內(nèi)存,因為MySQL通常會分配固定大小的內(nèi)存塊來保存內(nèi)部值。尤其是使用內(nèi)存臨時表進行排序或操作時會特別糟糕。在利用磁盤臨時表進行排序時也同樣糟糕。
例如在CHAR(4)和VARCHAR(4)中存放不同數(shù)據(jù)類型,其結(jié)果如下表所示:
所以最好的策略是只分配真正需要的空間。
1、 char長度固定, 即每條數(shù)據(jù)占用等長字節(jié)空間;適合用在身份證號碼、手機號碼等定。 2、 varchar可變長度,可以設(shè)置最大長度;適合用在長度可變的屬性。 3、 text不設(shè)置長度, 當不知道屬性的最大長度時,適合用text。 按照查詢速度: char最快, varchar次之,text最慢。
總結(jié)
1、長度的區(qū)別,char范圍是0~255,varchar最長是64k,但是注意這里的64k是整個row的長度,要考慮到其它的 column,還有如果存在not null的時候也會占用一位,對不同的字符集,有效長度還不一樣,比如utf8的,最多21845,還要除去別的column,但是varchar在一般 情況下存儲都夠用了。如果遇到了大文本,考慮使用text,最大能到4G。
2、效率來說基本是char>varchar>text,但是如果使用的是Innodb引擎的話,推薦使用varchar代替char。
3、char和varchar可以有默認值,text不能指定默認值。
4、數(shù)據(jù)庫選擇合適的數(shù)據(jù)類型存儲還是很有必要的,對性能有一定影響。這里在零碎記錄兩筆,對于int類型的,如果不需要存取負值,最好加上unsigned;對于經(jīng)常出現(xiàn)在where語句中的字段,考慮加索引,整形的尤其適合加索引。
當我們?yōu)樽址愋偷淖侄芜x取類型的時候,判斷該選取VARCHAR還是CHAR,我們可以從以下幾個方面來考慮:
該字段數(shù)據(jù)集的平均長度與最大長度是否相差很小,若相差很小優(yōu)先考慮CHAR類型,反之,考慮VARCHAR類型。 若字段存儲的是MD5后的哈希值,或一些定長的值,優(yōu)先選取CHAR類型。 若字段經(jīng)常需要更新,則優(yōu)先考慮CHAR類型,由于CHAR類型為定長,因此不容易產(chǎn)生碎片。 對于字段值存儲很小的信息,如性別等,優(yōu)先選取CHAR類型,因為VARCHAR類型會占用額外的字節(jié)保存字符串長度信息
總之一句話,當我們能夠選取CHAR類型的時候,或者說空間消耗相對并不是影響因素的重點時,盡量選取CHAR類型,因為在其他方面,CHAR類型都有著或多或少的優(yōu)勢。而當空間消耗成為了很大的影響因素以后,我們則考慮使用VARCHAR類型。
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇