1. 程式人生 > >面試現場:說說char 和 varchar的區別你瞭解多少?

面試現場:說說char 和 varchar的區別你瞭解多少?

Hi,大家好!我是白日夢!本文是MySQL專題的第 26 篇。 下文還是白日夢以自導自演的方式,圍繞“說說char 和 varchar的區別你瞭解多少?”展開本話題。看看你能抗到第幾問吧

換一種寫作風格,自導自演面試現場!感覺這樣還是比較有趣的,歡迎大家訂閱我的MySQL專題,公眾號首發!持續更新中~
[點選閱讀原文,格式會好看一點哦~](https://mp.weixin.qq.com/s/dGpIK4kw8PEOEsuPCp1XYw) [點選閱讀原文,格式會好看一點哦~](https://mp.weixin.qq.com/s/dGpIK4kw8PEOEsuPCp1XYw) [點選閱讀原文,格式會好看一點哦~](https://mp.weixin.qq.com/s/dGpIK4kw8PEOEsuPCp1XYw)

公眾號後臺回覆:資料庫 可以參與抽獎活動,3本《MySQL技術內幕-InnoDB儲存引擎》 歡迎關注白日夢,公眾號首發!持續連載中


Hi同學,聽說你上一面表現的還可以,這一面要不咱繼續?


嗯,好啊!




好,說說你瞭解的char和varchar兩種資料型別的區別吧


,char和varchar是MySQL中提供的兩種相似的列,都能儲存字元或者儲存字串。


比如型別為char(5)的列可以儲存5個字元、型別為varchar(5)的列也能儲存5個字元。




嗯,那它倆有啥區別?


嗯,它們確實存在區別。對於char型別來說,它的儲存的列的長度是不可變的。而varchar型別的列可以儲存可變長度的字串。




嗯,那你說說char型別怎麼個長度不可變法呢?


舉例說: 

插入時:比如char(5)的列表示這個列佔用的儲存空間一直是5個字元大小。你可以往型別為char(5)的a列中插入"abc",那"abc"很顯然是3個字元,而不是5個字元,此時在MySQL底層會替你將"abc"後面追加兩個空格字元成為:"abc  "


檢索時:當你往外檢索上面提到的a列時,MySQL會自動幫你做一次trim() 操作,幫你去掉最後的空格,返回"abc"。



實戰體會一下:插入時MySQL替我們新增空格,檢索時替我們去掉空格的例子。





嗯,你上面的回答總體上是沒有問題的。  不過我還有幾個問題,想問你一下。假如我的建表語句是這樣的:


create table t3(a char(5)) charset= utf8 engine = innoDB;


你注意:表的字符集型別是:GBK,那我的問題是:你覺得下面的兩條sql能執行成功嘛?又為什麼呢?



insert into t select '12345'; insert into t select '賜我白日夢';



嗯,兩條SQL都能執行成功的!建立資料表時你指定了char(5),它的意思是這列可以儲存5個字元而不是5個位元組。


對數字來說它是被包含在utf8中的,並且每個數字只會佔用一個byte,而中文也會被包含utf8中的,每個中文佔用3個byte。


綜上:當charset為utf8時,char(5) 這一列可以儲存的位元組範圍是[5*1,5*3],也就是[5,15]。所以上面的兩個SQL都能執行成功。




嗯,是的 。大家都在說varchar儲存可變長度的字串、char用來儲存不可變長度的字串。其實當使用的字符集編碼不同時,char能儲存的位元組數是會變化的!



那你在看下面的這個例子:


建立表:

create tab