很多地方在分析char與varchar數據類型選擇原則上,常常疏忽了存儲引擎。事實上,我們應當根據選定的存儲引擎,肯定如何選擇適合的數據類型。
值 | char(3) | 實際存儲字符長度 | varchar(3) | 實際存儲字符長度 |
---|---|---|---|---|
” | ’ ‘ | 3 | ” | 1 |
‘ab’ | ‘ab ‘ | 3 | ‘ab’ | 3 |
‘abc’ | ‘abc’ | 3 | ‘abc’ | 4 |
‘abcdefg’ | ‘abc’ | 3 | ‘abc’ | 4 |
總結:從上表可以看出,char屬于定長的。
char屬于定長類型,varchar屬于非定長類型,varchar屬于變長。可能有人會問為何varchar長度比數據長度大呢?由于VARCHAR保存時用1個字節或兩個字節長的前綴+數據。如果VARCHAR列聲明的長度大于255,長度前綴是兩個字節,否則是1個字節。
MyISAM數據表,最好使用固定長度的數據列代替可變長度的數據列。
建議使用VARCHAR類型。
對InnoDB數據表,內部的行存儲格式沒有辨別固定長度和可變長度列(所有數據行都使用指向數據列值的頭指針),因此在本質上,使用固定長度的CHAR列不1定比使用可變長度VARCHAR列簡單。因此,主要的性能因素是數據行使用的存儲總量。由于CHAR平均占用的空間多于VARCHAR,因此使用VARCHAR來最小化需要處理的數據行的存儲總量和磁盤I/O是比較好的。
MEMORY數據表目前都使用固定長度的數據行存儲,因此不管使用CHAR或VARCHAR列都沒有關系。二者都是作為CHAR類型處理的。
1.我們都知道,utf⑻的中文占3個字節,gbk占兩個字節,那末varchar(20)是否是只能存儲20個字節,即存儲6個漢字呢?
答:不是這樣的,(網上說5.0之前版本是這樣的,沒有測試)。mysql varchar(20) 不管中文還是英文都能存20個,但varchar字段的最大長度跟編碼有關,如果是utf⑻,那末大概65535/3,如果是gbk,那末大概65535/2