寫在前面
面試的時候突然有一位面試官問,說說CHAR和VARCHAR的區別,懵逼了,想自己平常使用的時候直接把VARCHAR拿來就用,真沒注意到其中的不同。
反思,為什么沒有注意到他們的不同
- 對於mysql知識體系建立的不完備,借用《如何高效學習》里面提到的觀點是:
mysql這座城市里,建立的高速公路不夠完備,所有的知識體系之間沒有建立關聯關系。這也是問到其中的知識一臉懵逼的原因。
- 平常使用時候,沒有多問“為什么”,為什么我們使用VARCHAR而不是使用CHAR,使用VARCHAR僅僅是為了存儲字符串嗎,那么為什么不使用CHAR呢?借用《如何構建億級流量架構》里的一句話:
任何事物都沒有表面看起來那么簡單。
- 我所認為的理所當然的事情真的是理所當然的嗎?
CHAR and VARCHAR 不同
那么如何解決這個問題,我們可以從哪些方面去解決這個問題?先自己想一想,然后再去Google。
- 有設計了兩個字段,那么這兩個字段的意義坑定是不一樣的(廢話 _),那么最明顯的就是長度的不同。
- 如果只是長度的不同,沒必要再來一個類型吧,(恩恩,有道理喔)
- 那我們去google一下吧
- 先來一個stack overflow的回答
直接貼出來,省的去打開地址
VARCHAR is variable-length.
CHAR is fixed length.
If your content is a fixed size, you'll get better performance with CHAR.
寫的很簡潔了,不過我想知道的更多,那怎么辦呢?-- 看文檔
- 再多一點
See the MySQL page on CHAR and VARCHAR Types,看人家官方就知道我們會提這個問題,已經准備了詳細的介紹。
先來一個表說明二者的不同
- VARCHAR存儲的時候不會填充;CHAR存儲的時候會進行填充,相應的在檢索的時候會自動去掉空格(也就是如果where CHAR類型的數據是沒有空格的),也就是說,我們如果我們insert的數據想要保留空格,那么不要使用CHAR存儲
- VARCHAR只存儲了ab為什么是3個字節?abcd為什么是5個字節?而CHAR就沒有這種情況,多出來的是什么原因?
官方介紹,VARCHAR值存儲的時候是 長度前綴+數據,長度前綴為1字節或2字節,如果值不超過255個字節,那么長度是1字節(2的8次方),如果長度超過255個字節,那么長度就是2個字節
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
1 row in set (0.06 sec)
- 長度的不同
- CHAR的長度是0-255(2的8次方)之間
- VARHCAR的長度是0-65,535(2的16次方)之間
- 主鍵上的填充
如果是主鍵,會自動去掉字符后面的所有空格