mysql CHAR and VARCHAR 比較


寫在前面

面試的時候突然有一位面試官問,說說CHAR和VARCHAR的區別,懵逼了,想自己平常使用的時候直接把VARCHAR拿來就用,真沒注意到其中的不同。

反思,為什么沒有注意到他們的不同

  1. 對於mysql知識體系建立的不完備,借用《如何高效學習》里面提到的觀點是:

mysql這座城市里,建立的高速公路不夠完備,所有的知識體系之間沒有建立關聯關系。這也是問到其中的知識一臉懵逼的原因。

  1. 平常使用時候,沒有多問“為什么”,為什么我們使用VARCHAR而不是使用CHAR,使用VARCHAR僅僅是為了存儲字符串嗎,那么為什么不使用CHAR呢?借用《如何構建億級流量架構》里的一句話:

任何事物都沒有表面看起來那么簡單。

  1. 我所認為的理所當然的事情真的是理所當然的嗎?

CHAR and VARCHAR 不同

那么如何解決這個問題,我們可以從哪些方面去解決這個問題?先自己想一想,然后再去Google。

  • 有設計了兩個字段,那么這兩個字段的意義坑定是不一樣的(廢話 _),那么最明顯的就是長度的不同。
  • 如果只是長度的不同,沒必要再來一個類型吧,(恩恩,有道理喔)
  • 那我們去google一下吧
  1. 先來一個stack overflow的回答

直接貼出來,省的去打開地址

VARCHAR is variable-length.
CHAR is fixed length.
If your content is a fixed size, you'll get better performance with CHAR.

寫的很簡潔了,不過我想知道的更多,那怎么辦呢?-- 看文檔

  1. 再多一點

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)
  1. 長度的不同
  • CHAR的長度是0-255(2的8次方)之間
  • VARHCAR的長度是0-65,535(2的16次方)之間
  1. 主鍵上的填充
    如果是主鍵,會自動去掉字符后面的所有空格


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM