1. 程式人生 > 實用技巧 >MySQL CHAR與VARCHAR

MySQL CHAR與VARCHAR

CHAR和VARCHAR區別

CHAR和VARCHAR型別類似,都用來儲存字串,但它們儲存和檢索的方式不同。CHAR屬於固定長度的字元型別,而VARCHAR屬於可變長度的字元型別。

注意表中最後一行的值只適用MySQL執行在非“嚴格模式”時,如果MySQL執行在嚴格模式,超過列長度的值將不會儲存,並且會出現錯誤提示。

尾部空格

從CHAR(4)和VARCHAR(4)列檢索的值並不總是相同,因為檢索時從CHAR列刪除了尾部的空格。下面通過一個例子來說明該差別:

CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
INSERT INTO vc VALUES ('
ab ', 'ab '); SELECT CONCAT(v, '+'), CONCAT(c, '+') FROM vc; -- ab +,ab+

由於CHAR是固定長度的,所以它的處理速度比VARCHAR快得多,但是其缺點是浪費儲存空間,程式需要對行尾空格進行處理,所以對於那些長度變化不大並且對查詢速度有較高要求的資料可以考慮使用CHAR型別來儲存。另外,隨著MySQL版本的不斷升級,VARCHAR資料型別的效能也在不斷改進並提高,所以在許多的應用中,VARCHAR型別被更多地使用。

不同儲存引擎

在MySQL中,不同的儲存引擎對CHAR和VARCHAR的使用原則有所不同,這裡簡單概括如下。

MyISAM儲存引擎:建議使用固定長度的資料列代替可變長度的資料列。

MEMORY 儲存引擎:目前都使用固定長度的資料行儲存,因此無論使用 CHAR 或VARCHAR列都沒有關係。兩者都是作為CHAR型別處理。

InnoDB儲存引擎:建議使用VARCHAR型別。對於InnoDB資料表,內部的行儲存格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指標),因此在本質上,使用固定長度的CHAR列不一定比使用可變長度VARCHAR列效能要好。因而,主要的效能因素是資料行使用的儲存總量。由於CHAR平均佔用的空間多於VARCHAR,因此使用VARCHAR來最小化需要處理的資料行的儲存總量和磁碟I/O是比較好的。