char和varchar類型相似,但是它們的儲存和檢索方式不同。在MySQL5.0.3,它們在最大長度和是否保留尾部空格也不相同。
char和varchar定義了字串的最大長度。例如,char(30)可以放30個字元。
char列的長度在你建表的時候,就是你定義的固定長度。值的範圍是0~255。char值儲存的時候,右部以空格來填充到指定的長度。當檢索char的時候,會自動去掉尾部的空格。
varchar列是變長的。在MySQL5.0.3之前可以定義的長度是0~255,之後可以定義到0~65535。在MySQL5.0.3及以後的版本中varchar列的有效長度,受行的最大值和使用的字元限制。
對比char,varchar,加上首碼的資料長度是當做一個位元組還是兩個位元組儲存。這個首碼的長度表明了值的位元組數。如果值不超過255的話,這個列用一個位元組的長度,如果這個值可能超過255個位元組,那麼就使用兩個位元組的長度。
如果嚴格的SQL模式沒有啟用,你分配了一個char或者varchar列超出了列的最大長度,那麼這個值就會被截短以填充列,這時候就會產生一個警告。對於截短的非空白字元,你可以設定嚴格的SQL模式,來產生一個錯誤。
對於varchar列來說,SQL模式在啟用的時候,大量的尾部空格在插入之前都會被截短,產生一個警告。對於char列來說,不管SQL模式是否被啟用,都會靜默地去掉插入值的過量的尾部空格。
varchar值儲存的時候是不會填充的。如何處理尾部空格,取決於版本。在MySQL5.0.3中,當值儲存和檢索的時候,保留尾部空格,和標準的SQL保持一致。在MySQL5.0.3之前,值被儲存到varchar列的時候,尾部空格會被剔除。這樣也就意味著檢索值的時候,也不存在這些空格。
在MySQL5.0.3之前,如果你需要一個不去掉尾部空格的資料類型的時候,要考慮BLOB或者TEXT類型。同樣當你儲存加密資料或者壓縮資料的時候,也要使用BLOB列,而不是char或者varchar列,來避免需要改變值的時候,尾部空格的潛在問題。
下面的表格來說明char和varchar的儲存方式和顯示結果的差別。(假設列用的很簡單的字元,使用latin1編碼)