char和vchar
Varchar往往用來(lái)保存可變長(zhǎng)度的字符串。簡(jiǎn)單的說(shuō),我們只是給其固定了一個(gè)最大值,然后系統(tǒng)會(huì)根據(jù)實(shí)際存儲(chǔ)的數(shù)據(jù)量來(lái)分配合適的存儲(chǔ)空間。
為此相比CHAR字符數(shù)據(jù)而言,其能夠比固定長(zhǎng)度類型占用更少的存儲(chǔ)空間。不過(guò)在實(shí)際工作中,由于某系特殊的原因,會(huì)在這里設(shè)置例外。如管理員可以根據(jù)需要指定ROW_FORMAT=FIXED選項(xiàng)。利用這個(gè)選項(xiàng)來(lái)創(chuàng)建MyISAM表的話,系統(tǒng)將會(huì)為每一行使用固定長(zhǎng)度的空間。此時(shí)會(huì)造成存儲(chǔ)空間的損耗。通常情況下,VARCHAR數(shù)據(jù)類型能夠節(jié)約磁盤(pán)空間,為此往往認(rèn)為其能夠提升數(shù)據(jù)庫(kù)的性能。不過(guò)這里需要注意的是,這往往是一把雙刃劍。
其在提升性能的同時(shí),往往也會(huì)產(chǎn)生一些副作用。如因?yàn)槠溟L(zhǎng)度是可變的,為此在數(shù)據(jù)進(jìn)行更新時(shí)可能會(huì)導(dǎo)致一些額外的工作。
如在更改前,其字符長(zhǎng)度是10位(Varchar規(guī)定的最長(zhǎng)字符數(shù)假設(shè)是50位),此時(shí)系統(tǒng)就只給其分配10個(gè)存儲(chǔ)的位置(假設(shè)不考慮系統(tǒng)自身的開(kāi)銷)。
更改后,其數(shù)據(jù)量達(dá)到了20位。由于沒(méi)有超過(guò)最大50位的限制,為此數(shù)據(jù)庫(kù)還是允許其存儲(chǔ)的。
只是其原先的存儲(chǔ)位置已經(jīng)無(wú)法滿足其存儲(chǔ)的需求。此時(shí)系統(tǒng)就需要進(jìn)行額外的操作。
如根據(jù)存儲(chǔ)引擎不同,有的會(huì)采用拆分機(jī)制,而有的則會(huì)采用分頁(yè)機(jī)制。
?
?
一是根據(jù)字符的長(zhǎng)度來(lái)判斷。
在實(shí)際項(xiàng)目中,如果某個(gè)字段的字符長(zhǎng)度比較短此時(shí)一般是采用固定字符長(zhǎng)度。
二是考慮其長(zhǎng)度的是否相近。
如果某個(gè)字段其長(zhǎng)度雖然比較長(zhǎng),但是其長(zhǎng)度總是近似的,如一般在90個(gè)到100個(gè)字符之間,甚至是相同的長(zhǎng)度。此時(shí)比較適合采用CHAR字符類型。
比較典型的應(yīng)用就是MD5哈希值。當(dāng)利用MD5哈希值來(lái)存儲(chǔ)用戶密碼時(shí),就非常使用采用CHAR字符類型。因?yàn)槠溟L(zhǎng)度是相同的。另外,像用來(lái)存儲(chǔ)用戶的身份證號(hào)碼等等,一般也建議使用CHAR類型的數(shù)據(jù)。
三是從碎片角度進(jìn)行考慮。
使用CHAR字符型時(shí),由于存儲(chǔ)空間都是一次性分配的。為此某個(gè)字段的內(nèi)容,其都是存儲(chǔ)在一起的。單從這個(gè)角度來(lái)講,其不存在碎片的困擾。而可變長(zhǎng)度的字符數(shù)據(jù)類型,其存儲(chǔ)的長(zhǎng)度是可變的。
當(dāng)其更改前后數(shù)據(jù)長(zhǎng)度不一致時(shí),就不可避免的會(huì)出現(xiàn)碎片的問(wèn)題。故使用可變長(zhǎng)度的字符型數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)管理員要時(shí)不時(shí)的對(duì)碎片進(jìn)行整理。如執(zhí)行數(shù)據(jù)庫(kù)導(dǎo)出導(dǎo)入作業(yè),來(lái)消除碎片。
四是即使使用Varchar數(shù)據(jù)類型,也不能夠太過(guò)于慷慨。
這是什么意思呢?如現(xiàn)在用戶需要存儲(chǔ)一個(gè)地址信息。根據(jù)評(píng)估,只要使用100個(gè)字符就可以了。但是有些數(shù)據(jù)庫(kù)管理員會(huì)認(rèn)為,反正Varchar數(shù)據(jù)類型是根據(jù)實(shí)際的需要來(lái)分配長(zhǎng)度的。還不如給其大一點(diǎn)的呢。為此他們可能會(huì)為這個(gè)字段一次性分配200個(gè)字符的存儲(chǔ)空間。這VARCHAR(100)與VARCHAR(200)真的相同嗎?結(jié)果是否定的。
雖然他們用來(lái)存儲(chǔ)90個(gè)字符的數(shù)據(jù),其存儲(chǔ)空間相同。但是對(duì)于內(nèi)存的消耗是不同的。對(duì)于VARCHAR數(shù)據(jù)類型來(lái)說(shuō),硬盤(pán)上的存儲(chǔ)空間雖然都是根據(jù)實(shí)際字符長(zhǎng)度來(lái)分配存儲(chǔ)空間的,但是對(duì)于內(nèi)存來(lái)說(shuō),則不是。其時(shí)使用固定大小的內(nèi)存塊來(lái)保存值。簡(jiǎn)單的說(shuō),就是使用字符類型中定義的長(zhǎng)度,即200個(gè)字符空間。顯然,這對(duì)于排序或者臨時(shí)表(這些內(nèi)容都需要通過(guò)內(nèi)存來(lái)實(shí)現(xiàn))作業(yè)會(huì)產(chǎn)生比較大的不利影響。
轉(zhuǎn)載于:https://www.cnblogs.com/chucklu/p/4363254.html
總結(jié)
以上是生活随笔為你收集整理的char和vchar的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MyBatis简介与配置MyBatis+
- 下一篇: C#Winform版获取Excel文件的