背景
學過MySQL的同學都知道MySQL中varchar和char是兩種最主要的字符串類型,varchar是變長的類型,而char是固定長度。那關於如何選擇類型就成為令人頭疼的事,很多初學者為了保證業務兼容性強,存儲字符串類型一律都是varchar類型。這是不妥的,需要根據varchar和char的特性來進行選擇。
varchar和char數據類型的區別
varchar類型用於存儲可變長的字符串,是比較常見常用的字符串數據類型,在存儲的字符串是變長時,varchar更加節約空間。由於varchar是變長的,在使用update的時候,可能使得行變得比原來更長,這就導致需要做額外的工作。如果一個行占用的空間增加,並且在頁內沒有多余的空間可與存儲,這是innoDB的存儲引擎需要分裂頁來使行可以放進頁內。
char類型是定長的。在存儲數據時,MySQL會刪除所有文末的空格,所以,即便你存儲的是:'abc ',注意這個字符串末尾是有空格的,也會在存儲時把這個空格刪掉,這點需要注意。
適用的場景
varchar適用的場景:
- 字符串列的最大長度比平均長度要大很多;
- 字符串列的更新很少時,因為沒有或很少有內存碎片問題;
- 使用了UTF-8這樣復雜的字符集,每個字符都使用不同的字節數進行存儲;
char適用的場景:
- 列的長度為定值時適合適用,比如:MD5密文數據
varchar和char的優缺點
varchar的優點:
- 變長的字符串類型,兼容性更好
varchar的缺點:
- 使用varchar可能會產生內存碎片
- varchar會額外需要1到2個字節存儲長度信息
- update語句可能會導致頁分裂
char的優點:
- 定長的字符串類型,減少內存碎片
- 無需額外的內存空間去存儲長度信息
char的缺點:
- 會刪除列末尾的空格信息
參考:
《高性能MySQL第3版》第四章
