面試現場:說說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替我們新增空格,檢索時替我們去掉空格的例子。
嗯,你上面的回答總體上是沒有問題的。 不過我還有幾個問題,想問你一下。假如我的建表語句是這樣的:
嗯,兩條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 table t3(a char(5)) charset= utf8 engine = innoDB;
insert into t select '12345'; insert into t select '賜我白日夢';
create tab