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