在一個(gè)資料表裡,如果每一個(gè)資料列的長(zhǎng)度都是固定的,那麼每一個(gè)資料行的長(zhǎng)度也將是固定的,只要資料表裡有一個(gè)資料列的長(zhǎng)度的可變的,那麼各資料行的長(zhǎng)度都是可變的,如果某個(gè)資料表裡的資料行的長(zhǎng)度是可變的,那麼,為了節(jié)約儲(chǔ)存空間,MySQL會(huì)把這個(gè)資料表裡的固定長(zhǎng)度類(lèi)型的資料列轉(zhuǎn)換為對(duì)應(yīng)的可變長(zhǎng)度類(lèi)型,長(zhǎng)度小於4個(gè)字元的char資料列不會(huì)轉(zhuǎn)換為varchar類(lèi)型
如果一張表有一個(gè)欄位是varchar,那麼這張表建立char欄位還有意義嗎?
認(rèn)證0級(jí)講師
第一你要理解清楚char和varchar的差別。
1. CHAR的長(zhǎng)度是固定的,而VARCHAR2的長(zhǎng)度是可以變化的, 例如,儲(chǔ)存字串「abc",對(duì)於CHAR (10),表示你儲(chǔ)存的字元將佔(zhàn)10個(gè)位元組(包括7個(gè)空字元),而同樣的VARCHAR2 (10)則只佔(zhàn)用3個(gè)位元組的長(zhǎng)度,10只是最大值,當(dāng)你儲(chǔ)存的字元小於10時(shí),以實(shí)際長(zhǎng)度儲(chǔ)存。
2. CHAR的效率比VARCHAR2的效率稍高。
3.目前VARCHAR是VARCHAR2的同義字。工業(yè)標(biāo)準(zhǔn)的VARCHAR類(lèi)型可以?xún)?chǔ)存空字串,但是oracle不這樣做,儘管它保留以後這樣做的權(quán)利。 Oracle自己開(kāi)發(fā)了一個(gè)資料型別VARCHAR2,這個(gè)型別不是一個(gè)標(biāo)準(zhǔn)的VARCHAR,它將在資料庫(kù)中varchar列可以?xún)?chǔ)存空字串的特性改為儲(chǔ)存NULL值。如果你想要有向後相容的能力,Oracle建議使用VARCHAR2而不是VARCHAR。
何時(shí)該用CHAR,何時(shí)該用varchar2?
CHAR與VARCHAR2是一對(duì)矛盾的統(tǒng)一體,兩者是互補(bǔ)的關(guān)係.
VARCHAR2比CHAR節(jié)省空間,在效率上比CHAR會(huì)稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們?cè)谫Y料庫(kù)設(shè)計(jì)上常說(shuō)的'以空間換效率'。
VARCHAR2雖然比CHAR節(jié)省空間,但是如果一個(gè)VARCHAR2列經(jīng)常被修改,而且每次被修改的資料的長(zhǎng)度不同,這會(huì)引起'行遷移'(Row Migration)現(xiàn)象,而這造成多餘的I/O,是資料庫(kù)設(shè)計(jì)和調(diào)整中要盡力避免的,在這種情況下用CHAR取代VARCHAR2會(huì)比較好。
這個(gè)答案是引用百度答案https://zhidao.baidu.com/ques...
我覺(jué)得回答好詳盡