在MySQL建表sql里,我們經常會有定義字符串類型的需求。
CREATE TABLE `user` (
`name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
比方說user表里的名字,就是個字符串。MySQL里有兩個類型比較適合這個場景。
char和varchar。
聲明它們都需要在字段邊上加個數組,比如char(100)和varchar(100),這個100是指當前字段能放的最大字符數。
char和varchar的區別在于,varchar雖然聲明了最大能放100個字符,但一開始不需要分配100個字符的空間,可以根據需要慢慢增加空間。而char一開始聲明是多少,就固定預留多少空間。
所以,varchar比起char更省空間,一般沒啥大事,大家都愛用varchar。
那問題來了,聲明varchar字段時,它的最大長度是多少呢?
相信大家應該聽說過varchar字段的最大長度是65535吧,沒聽過也沒關系,你現在聽到了。
但實際上是這樣嗎?我們來做個實驗。
一、varchar最大值是多少
我們直接拿65535來試一下。
長度為65535的varchar報錯
很明顯報錯了。報錯內容也說了, 由于列長度過大導致報錯,最長是16383。
把上面的65535改成 16383,確實是成功了。
哦?所以說varchar最大值是16383?
當然不是,這其實還有好幾個因素影響這個最大值。
二、不同字符集的影響
varchar里放的是字符串,而字符串看起來可以是英文字母,也可以是數字或中文。但不管怎么樣,都可以把這樣的中英文數字轉成二進制的01串。
按照一定規則把符號和二進制碼對應起來,這就是編碼。而把n多這種已經編碼的字符聚在一起,就是我們常說的字符集。
建表語句里有個CHARSET,這里填的是字符集。
不同的字符集要求使用的字節個數也不同,我們可以通過 show charset; 看到mysql支持哪些字符集,以及這些字符集里存儲一個字符所需的最大字節數(Maxlen)。
查看mysql支持哪些charset
我們嘗試下把建表sql語句里的CHARSET改一改,比如改成utf8mb3。
我們再執