MySQL中char與varchar數(shù)據(jù)類型選擇原則

很多地方在分析char與varchar數(shù)據(jù)類型選擇原則上,往往忽略了存儲(chǔ)引擎。事實(shí)上,我們應(yīng)當(dāng)根據(jù)選定的存儲(chǔ)引擎,確定如何選擇合適的數(shù)據(jù)類型。

char與varchar比較

char(3) 實(shí)際存儲(chǔ)字符長(zhǎng)度 varchar(3) 實(shí)際存儲(chǔ)字符長(zhǎng)度
’ ? ‘ 3 1
‘a(chǎn)b’ ‘a(chǎn)b ‘ 3 ‘a(chǎn)b’ 3
‘a(chǎn)bc’ ‘a(chǎn)bc’ 3 ‘a(chǎn)bc’ 4
‘a(chǎn)bcdefg’ ‘a(chǎn)bc’ 3 ‘a(chǎn)bc’ 4

總結(jié):從上表可以看出,char屬于定長(zhǎng)的。
char屬于定長(zhǎng)類型,varchar屬于非定長(zhǎng)類型,varchar屬于變長(zhǎng)。可能有人會(huì)問為什么varchar長(zhǎng)度比數(shù)據(jù)長(zhǎng)度大呢?因?yàn)閂ARCHAR保存時(shí)用一個(gè)字節(jié)或兩個(gè)字節(jié)長(zhǎng)的前綴+數(shù)據(jù)。如果VARCHAR列聲明的長(zhǎng)度大于255,長(zhǎng)度前綴是兩個(gè)字節(jié),否則是一個(gè)字節(jié)。

MyISAM存儲(chǔ)引擎

MyISAM數(shù)據(jù)表,最好使用固定長(zhǎng)度的數(shù)據(jù)列代替可變長(zhǎng)度的數(shù)據(jù)列。

InnoDB 存儲(chǔ)引擎

建議使用VARCHAR類型。
對(duì)于InnoDB數(shù)據(jù)表,內(nèi)部的行存儲(chǔ)格式?jīng)]有區(qū)分固定長(zhǎng)度和可變長(zhǎng)度列(所有數(shù)據(jù)行都使用指向數(shù)據(jù)列值的頭指針),因此在本質(zhì)上,使用固定長(zhǎng)度的CHAR列不一定比使用可變長(zhǎng)度VARCHAR列簡(jiǎn)單。因而,主要的性能因素是數(shù)據(jù)行使用的存儲(chǔ)總量。由于CHAR平均占用的空間多于VARCHAR,因此使用VARCHAR來最小化需要處理的數(shù)據(jù)行的存儲(chǔ)總量和磁盤I/O是比較好的。

MEMORY存儲(chǔ)引擎

MEMORY數(shù)據(jù)表目前都使用固定長(zhǎng)度的數(shù)據(jù)行存儲(chǔ),因此無論使用CHAR或VARCHAR列都沒有關(guān)系。兩者都是作為CHAR類型處理的。

誤區(qū)

1.我們都知道,utf-8的中文占3個(gè)字節(jié),gbk占兩個(gè)字節(jié),那么varchar(20)是不是只能存儲(chǔ)20個(gè)字節(jié),即存儲(chǔ)6個(gè)漢字呢?
答:不是這樣的,(網(wǎng)上說5.0之前版本是這樣的,沒有測(cè)試)。mysql varchar(20) ?不管中文還是英文都能存20個(gè),但varchar字段的最大長(zhǎng)度跟編碼有關(guān),如果是utf-8,那么大概65535/3,如果是gbk,那么大概65535/2

很多地方在分析char與varchar數(shù)據(jù)類型選擇原則上,往往忽略了存儲(chǔ)引擎。事實(shí)上,我們應(yīng)當(dāng)根據(jù)選定的存儲(chǔ)引擎,確定如何選擇合適的數(shù)據(jù)類型。

?以上就是MySQL中char與varchar數(shù)據(jù)類型選擇原則的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.php.cn)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享