mysql中char與varchar的區(qū)別:
char:
- 定長,效率高佑颇,一般用于固定長度的表單提交數(shù)據(jù)存儲(chǔ) ;例如:身份證號(hào)菇篡,手機(jī)號(hào)漩符,電話,密碼等
varchar:
- 不定長驱还,更節(jié)省空間嗜暴。
- varchar類型需要在數(shù)據(jù)之前利用一個(gè)或者兩個(gè)字節(jié)來存儲(chǔ)數(shù)據(jù)的長度凸克。具體規(guī)則是:如果列的最大長度小于或等于255字節(jié),則只使用1個(gè)字節(jié)表示闷沥,否則使用2個(gè)字節(jié)萎战。
- 在內(nèi)存中的操作方式,varchar也是按照最長的方式在內(nèi)存中進(jìn)行操作的舆逃。比如說要進(jìn)行排序的時(shí)候蚂维,varcahr(100)是按照100這個(gè)長度來進(jìn)行的。
- mysql的vachar字段的類型雖然最大長度是65535路狮,但是并不是能存這么多數(shù)據(jù)虫啥,最大可以到65533(不允許非空字段的時(shí)候),當(dāng)允許非空字段的時(shí)候只能到65532【在允許空的時(shí)候奄妨,varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte】
update時(shí)的分裂頁涂籽,碎片
- varchar由于行是變長的,在UPDATE時(shí)可能使行變得比原來更長砸抛,這就導(dǎo)致需要做額外的工作评雌。如果一個(gè)行占用的空間增長,并且在頁內(nèi)沒有更多的空間可以存儲(chǔ)直焙,在這種情況下景东,不同的存儲(chǔ)引擎的處理方式是不一樣的。例如奔誓,MyISAM會(huì)將行拆成不同的片段存儲(chǔ)斤吐,InnoDB 則需要分裂頁來使行可以放進(jìn)頁內(nèi)。其他一些存儲(chǔ)引擎也許從不在原數(shù)據(jù)位置更新數(shù)據(jù)厨喂。
- 從碎片角度進(jìn)行考慮曲初,使用CHAR字符型時(shí),由于存儲(chǔ)空間都是一次性分配的。為此某個(gè)字段的內(nèi)容,其都是存儲(chǔ)在一起的宜咒。單從這個(gè)角度來講修械,其不存在碎片的困擾。
- 而可變長度的字符數(shù)據(jù)類型VARCHAR故响,其存儲(chǔ)的長度是可變的傀广。當(dāng)其更改前后數(shù)據(jù)長度不一致時(shí),就不可避免的會(huì)出現(xiàn)碎片的問題彩届。故使用可變長度的字符型數(shù)據(jù)時(shí)伪冰,數(shù)據(jù)庫管理員要時(shí)不時(shí)的對碎片進(jìn)行整理。如執(zhí)行數(shù)據(jù)庫導(dǎo)出導(dǎo)入作業(yè)樟蠕,來消除碎片贮聂。