????????今天看《高性能MySQL(第四版)》,講char,varchar時說“當存儲CHAR值時,MySQL刪除所有尾隨空格。如果需要進行比較,值會用空格填充。”感覺這兩句話有沖突啊,便研究了下。
? ? ? ? 對于具體的問題,當然官方文檔是最好的,The CHAR and VARCHAR Types,推薦閱讀全文。
????????原來并不是“如果需要進行比較”,而是因為是定長,會用空格填充。
????????那么就想到了一個問題,為什么要填充。為什么用空格填充。網上沒找到相關資料,我試著回答下(就是猜的)
為什么填充:
????????以char(10)為例,這里的10指10個字符,char(10)到底占用多少磁盤空間,和字符集有關。因為是固定長度,已經分配了這么多空間。如果不填充,就會造成碎片問題,不連續。
為什么用空格填充:
????????char類型存儲的是字符而不是字節。分配固定長度之后,空余部分肯定要存貯當前字符集中的某個字符,邏輯上講用空格填充應該是最合適的。也不能用“00***00”,因為“00***00”在當前字符集中可能不是任何字符,即便是某個字符,也不如用空格表示更合理。
????????右側用空格填充,那么原本右側的空格和填充的空格就分不清了,就會有右側空格丟失的問題。
固定長度有什么好處呢:
1、對于經常修改的數據,VARCHAR容易出現碎片(長變短),還可能有重建記錄、頁分裂的開銷(短變長)。
2、對于非常短的列,CHAR也比VARCHAR更高效;設計為只保存Y和N的值的CHAR(1)在單字節字符集[插圖]中只使用1字節,但VARCHAR(1)需要2字節,因為還有一個記錄長度的額外字節。
?