很多地方在分析char與varchar數據類型選擇原則上,往往忽略了存儲引擎。事實上,我們應當根據選定的存儲引擎,確定如何選擇合適的數據類型。
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保存時用一個字節或兩個字節長的前綴+數據。如果VARCHAR列聲明的長度大于255,長度前綴是兩個字節,否則是一個字節。
MyISAM存儲引擎
MyISAM數據表,最好使用固定長度的數據列代替可變長度的數據列。
InnoDB 存儲引擎
建議使用VARCHAR類型。
對于InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(所有數據行都使用指向數據列值的頭指針),因此在本質上,使用固定長度的CHAR列不一定比使用可變長度VARCHAR列簡單。因而,主要的性能因素是數據行使用的存儲總量。由于CHAR平均占用的空間多于VARCHAR,因此使用VARCHAR來最小化需要處理的數據行的存儲總量和磁盤I/O是比較好的。
MEMORY存儲引擎
MEMORY數據表目前都使用固定長度的數據行存儲,因此無論使用CHAR或VARCHAR列都沒有關系。兩者都是作為CHAR類型處理的。
誤區
1.我們都知道,utf-8的中文占3個字節,gbk占兩個字節,那么varchar(20)是不是只能存儲20個字節,即存儲6個漢字呢?
答:不是這樣的,(網上說5.0之前版本是這樣的,沒有測試)。mysql varchar(20) ?不管中文還是英文都能存20個,但varchar字段的最大長度跟編碼有關,如果是utf-8,那么大概65535/3,如果是gbk,那么大概65535/2
很多地方在分析char與varchar數據類型選擇原則上,往往忽略了存儲引擎。事實上,我們應當根據選定的存儲引擎,確定如何選擇合適的數據類型。
?以上就是MySQL中char與varchar數據類型選擇原則的內容,更多相關內容請關注PHP中文網(www.php.cn)!