對線面試官-CHAR和VARCHAR了解嘛,區(qū)別是什么
面試官:我看你們項目上用的是MySQL,相關(guān)的類型了解嗎?
派大星:嗯,了解一些。
面試官:嗯,那你知道char和varchar的區(qū)別是什么嘛?簡單說一說。
派大星:好的。
首先,CHAR和VARCHAR均為數(shù)據(jù)庫中用于存儲字符串?dāng)?shù)據(jù)的數(shù)據(jù)類型。它們之間的主要區(qū)別在于存儲空間的使用方式。
比如:CHAR為一種定長數(shù)據(jù)類型,其長度固定且在存儲時會自動加入空格以填滿指定長度,長度范圍為0至255;
VARCHAR則為一種可變長度數(shù)據(jù)類型,僅存儲實際的字符串內(nèi)容,無需填充空格。故在存儲短字符串時,VARCHAR能夠節(jié)省空間,長度范圍為0至65535(適用于MySQL 5.0.3及之后版本)。
若采用CHAR(100),插入記錄后即分配了100個字符,后續(xù)修改不引起頁分裂問題;而VARCHAR(100)因未預(yù)分配存儲空間,初始插入數(shù)據(jù)時,可變長度字段按實際長度儲存,且數(shù)據(jù)在文件中緊密連續(xù)。若值變長,原位置無法擴展,無法覆蓋原空間,MySQL將采用頁分裂方式擴展字段的長度。
面試官:不錯,既然這樣,它倆在使用的時候有什么有缺點呢?
派大星:
VARCHAR的優(yōu)勢:在于其可變長度的字符類型,具有更好的兼容性;然而,使用VARCHAR可能引發(fā)內(nèi)存碎片問題,需要額外1到2個字節(jié)存儲長度信息,并更新語句可能導(dǎo)致頁分裂等情況。
舉例來說,適合使用VARCHAR的場景包括存儲產(chǎn)品描述(可變長度)、用戶地址(可變長度)以及用戶名稱(可變長度)。
CHAR的長處在于其定長字符串類型,有助于減少內(nèi)存碎片,并無需額外的磁盤空間來存儲長度信息;但其短板在于會消除列末尾的空格信息。
CHAR在長度不足時會補充空格,因此,當(dāng)在一個長度為10的CHAR中分別存儲"paidaxing "和"paidaxing"時,實際存儲的均為"paidaxing ",導(dǎo)致原空格信息喪失。
舉例來說,適合使用CHAR的情境包括存儲身份證號(固定長度)、訂單號(固定長度)以及國家編碼(固定長度)。
面試官:挺好,看來確實掌握的不錯。
派大星:嘿嘿,謝謝,就是在使用過程中有去比較了解過。畢竟如果在設(shè)計索引的時候需要考慮,具體的索引設(shè)計原則以及優(yōu)化慢SQL可參考?xì)v史文章:
日活3kw下,如何應(yīng)對實際業(yè)務(wù)場景中SQL過慢的優(yōu)化挑戰(zhàn)?