MySQL中CHAR和VARCHAR的區(qū)別

VARCHAR和CHAR是兩種最主要的字符串類型。不幸的是,很難精確地解釋這些值是怎么存儲(chǔ)在磁盤和內(nèi)存中的,因?yàn)檫@跟存儲(chǔ)引擎的具體實(shí)現(xiàn)有關(guān)。下面的描述假設(shè)使用的存儲(chǔ)引擎是InnoDB和/或者M(jìn)yISAM。如果使用的不是這兩種存儲(chǔ)引擎,請(qǐng)參考所使用的存儲(chǔ)引擎的文檔。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、拱墅ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的拱墅網(wǎng)站制作公司

先看看VARCHAR和CHAR值通常在磁盤上怎么存儲(chǔ)。請(qǐng)注意,存儲(chǔ)引擎存儲(chǔ)CHAR或者VARCHAR值的方式在內(nèi)存中和在磁盤上可能不一樣,所以MySQL服務(wù)器從存儲(chǔ)引擎讀出的值可能需要轉(zhuǎn)換為另一種存儲(chǔ)格式。

VARCHAR類型

VARCHAR類型用于存儲(chǔ)可變長(zhǎng)字符串,是最常見(jiàn)的字符串?dāng)?shù)據(jù)類型。它比定長(zhǎng)類型更節(jié)省空間,因?yàn)樗鼉H使用必要的空間(例如,越短的字符串使用越少的空間)。有一種情況例外,如果MySQL表使用ROW_FORMAT=FIXED創(chuàng)建的話,每一行都會(huì)使用定長(zhǎng)存儲(chǔ),這會(huì)很浪費(fèi)空間。

VARCHAR需要使用1或2個(gè)額外字節(jié)記錄字符串的長(zhǎng)度:如果列的大長(zhǎng)度小于或等于255字節(jié),則只使用1個(gè)字節(jié)表示,否則使用2個(gè)字節(jié)。假設(shè)采用latin1字符集,一個(gè)VARCHAR(10)的列需要11個(gè)字節(jié)的存儲(chǔ)空間。VARCHAR(1000)的列則需要1002個(gè)字節(jié),因?yàn)樾枰?個(gè)字節(jié)存儲(chǔ)長(zhǎng)度信息。

VARCHAR節(jié)省了存儲(chǔ)空間,所以對(duì)性能也有幫助。但是,由于行是變長(zhǎng)的,在UPDATE時(shí)可能使行變得比原來(lái)更長(zhǎng),這就導(dǎo)致需要做額外的工作。如果一個(gè)行占用的空間增長(zhǎng),并且在頁(yè)內(nèi)沒(méi)有更多的空間可以存儲(chǔ),在這種情況下,不同的存儲(chǔ)引擎的處理方式是不一樣的。例如,MyISAM會(huì)將行拆成不同的片段存儲(chǔ),InnoDB則需要分裂頁(yè)來(lái)使行可以放進(jìn)頁(yè)內(nèi)。其他一些存儲(chǔ)引擎也許從不在原數(shù)據(jù)位置更新數(shù)據(jù)。

VARCHAR適用情況

下面這些情況下適用VARCHAR是合適的:

字符串列的大長(zhǎng)度比平均長(zhǎng)度大很多

列的更新很少,所以碎片不是問(wèn)題

使用了像UTF-8這樣復(fù)雜的字符集,每個(gè)字符都使用不同的字節(jié)數(shù)進(jìn)行存儲(chǔ)

CHAR類型

CHAR類型是定長(zhǎng)的:MySQL總是根據(jù)定義的字符串長(zhǎng)度分配足夠的空間。當(dāng)存儲(chǔ)CHAR值時(shí),MySQL會(huì)刪除所有的末尾空格。CHAR值會(huì)根據(jù)需要采用空格進(jìn)行填充以方便比較。

CHAR適合存儲(chǔ)很短的字符串,或者所有值都接近同一個(gè)長(zhǎng)度。例如,CHAR非常適合存儲(chǔ)密碼的MD5值,因?yàn)檫@是一個(gè)定長(zhǎng)的值。對(duì)于經(jīng)常變更的數(shù)據(jù),CHAR也比VARCHAR更好,因?yàn)槎ㄩL(zhǎng)的CHAR類型不容易產(chǎn)生碎片。對(duì)于非常短的列,CHAR比VARCHAR在存儲(chǔ)空間上也更有效率。例如用CHAR(1)來(lái)存儲(chǔ)只有Y和N的值,如果采用單字節(jié)字符集只需要一個(gè)字節(jié),但是VARCHAR(1)卻需要兩個(gè)字節(jié),因?yàn)檫€有一個(gè)記錄長(zhǎng)度的額外字節(jié)。

當(dāng)前標(biāo)題:MySQL中CHAR和VARCHAR的區(qū)別
分享地址:http://www.muchs.cn/article42/csdhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營(yíng)銷推廣外貿(mào)建站、微信公眾號(hào)網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化