MySQL 欄位格式 CHAR 與 VARCHAR 的差異

MySQL 規劃欄位的時候, 常常會用到 char 與 varchar, 那這兩個的差異在哪邊?  怎麼樣使用才能節省空間呢?

MySQL CHAR 與 VARCHAR 的差異

此篇文章解釋說明的很清楚, 之前一直認為 varchar 會比較省空間, 原來是不一定的~

詳見: CHAR vs VARCHAR in MySQL, 下述內容摘錄整理自此篇:

下述就來對 CHAR 與 VARCHAR 做簡單的比較.

容忍長度
  • char: 0 ~ 255
  • varchar: 0 ~ 65535
儲存方式 與 佔用容量

CHAR(5)

  • 內容 vs 實際儲存
  • 'ex'     'ex   ' 5 byptes # 會多存三個空白
  • 'expe'   'expe ' 5 byptes
  • 'exper'  'exper' 5 byptes
  • 'expert' 'exper' 5 byptes

VARCHAR(5)

  • 內容 vs 實際儲存
  • 'ex'     'ex' 3 byptes # 多 1 byte 是存長度
  • 'expe'   'expe' 5 byptes
  • 'exper'  'exper' 6 byptes
  • 'expert' 'exper' 6 byptes # 多 1 byte 不是存 t, 而是存長度
  • 註: VARCHAR 超過 255 的話, 會多 2 bytes.

由上述可知, 若是對 CHAR(1) 這種 Flag(內容可能是存 y/n), 使用 VARCHAR 反而會多存 1 byte. (1 byte 內容, 1 byte 長度)

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈MySQL 欄位格式 CHAR 與 VARCHAR 的差異〉中有 2 則留言

  1. 在實際應用上,我想Y|N、男|女這一類「已知固定答案」的欄位,用ENUM()會更快也更安全。char()比較適合用在資訊格式固定但內容很多變的部份,例如港口(HKG, TPE)之類。

    曾有聽說用char()儲存資料,在讀取時速度會比varchar()快,原因據說是「varchar()需要耗費一個運算週期去定址找資料,而char()則因為字元數固定關係,可以直接取得」。不知道這種說法有沒有根據?

    1. 嗯嗯,ENUM() 確實對已知的會比較快也安全,缺點是有時候會有擴充的時候,就會需要動到 DB。(舉個例子來說:男 / 女,現在居然出現 中性(含NA)),這時候 CHAR 是比較方便(於程式面著手)

      char() 比 varchar() 快,我也是有聽過這種說法,當然固定位址一定比較好取得,varchar() 動態計算才能省空間,速度上來說一定會慢一些些,不過實際還是得要測試看看才會知道,我沒去做這個實驗~ 🙂

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料