CHAR和VARCHAR類型類似,都用來存儲字符串,但它們“保存”和“檢索”的方式不同。CHAR屬於“固定長度”的字符串,而VARCHAR屬於“可變長度”的字符類型。
下表顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結果,說明了CHAR和VARCHAR之間的差別。
CHAR和VARCHAR的對比
值 | CHAR(4) | 存儲需求 | VARCHAR(4) | 存儲需求 |
'' | ' ' | 4個字節 | '' | 1個字節 |
'ab' | 'ab ' | 4個字節 | 'ab' | 3個字節 |
'abcd' | 'abcd' | 4個字節 | 'abcd' | 5個字節 |
'abcdefgh' | 'abcd' | 4個字節 | 'abcd' | 5個字節 |
注意上表中最后一行的值只適用mysql運行在非“嚴格模式”時,如果mysql運行在嚴格模式,超過列長度的值將不會保存,並且會出現錯誤提示。
從CHAR(4)和VARCHAR(4)列檢索的值並不總是相同,因為檢索時從CHAR列刪除了尾部的空格。下面通過一個例子來說明該差別:
由於CHAR是固定長度的,所以它的處理速度比VARCHAR快得多,但是其缺點是浪費存儲空間,程序需要對行尾空格進行處理,所以對於那些長度變化不大並且對查詢速度有較高要求的數據可以考慮使用CHAR類型來存儲。
另外,隨着mysql版本的不斷升級,VARCHAR數據類型的性能也在不斷改進並提高,所以在許多的應用中,VARCAHR類型被更多地使用。
在mysql中,不同的存儲引擎對CHAR和VARCHAR的使用原則有所不同,這里簡單概括如下。
- MyISAM存儲引擎:建議使用固定長度的數據列代替可變長度的數據列。
- MEMORY存儲引擎:目前都使用固定長度的數據行存儲,因此無論使用CHAR或VARCHAR列都沒有關系。兩者都是作為CHAR類型處理。
- InnoDB存儲引擎:建議使用VARCHAR類型。對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(所有數據行都使用指向數據列值的頭指針),因此在本質上,使用固定長度的CHAR列不一定比使用可變長度VARCHAR列性能要好。因而,主要的性能因素是數據行使用的存儲總量。由於CHAR平均占用的空間多於VARCHAR,因此使用VARCHAR來最小化需要處理的數據行的存儲總量和磁盤I/O是比較好的。