0
点赞
收藏
分享

微信扫一扫

自导自演的面试现场:说说char 和 varchar的区别你了解多少?

Hi,大家好!我是白日梦!本文是MySQL专题的第 26 篇。

下文还是白日梦以自导自演的方式,围绕“说说char 和 varchar的区别你了解多少?”展开本话题。看看你能

自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql


Hi同学,听说你上一面表现的还可以,这一面要不咱继续?自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_02


嗯,好啊!自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql_03


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_04


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql


好,说说你了解的char和varchar两种数据类型的区别吧自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql_06


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql_07,char和varchar是MySQL中提供的两种相似的列,都能存储字符或者存储字符串。

比如类型为char(5)的列可以存储5个字符、类型为varchar(5)的列也能存储5个字符。


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_04


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql


嗯,那它俩有啥区别?自导自演的面试现场:说说char 和 varchar的区别你了解多少?_字符串_10


嗯,它们确实存在区别。对于char类型来说,它的存储的列的长度是不可变的。而varchar类型的列可以存储可变长度的字符串。


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_04


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql


嗯,那你说说char类型怎么个长度不可变法呢?自导自演的面试现场:说说char 和 varchar的区别你了解多少?_字符串_10


举例说: 

插入时:比如char(5)的列表示这个列占用的存储空间一直是5个字符大小。你可以往类型为char(5)的a列中插入"abc",那"abc"很显然是3个字符,而不是5个字符,此时在MySQL底层会替你将"abc"后面追加两个空格字符成为:"abc  "

检索时:当你往外检索上面提到的a列时,MySQL会自动帮你做一次trim() 操作,帮你去掉最后的空格,返回"abc"。


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_04


实战体会一下:插入时MySQL替我们添加空格,检索时替我们去掉空格的例子。

自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql_15


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_04


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql


嗯,你上面的回答总体上是没有问题的。自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_02 不过我还有几个问题,想问你一下。假如我的建表语句是这样的:

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


你注意:表的字符集类型是:GBK,那我的问题是:你觉得下面的两条sql能执行成功嘛?又为什么呢?

insert into t select '12345'; insert into t select '赐我白日梦';


可以存储5个字符而不是5个字节。

对数字来说它是被包含在utf8中的,并且每个数字只会占用一个byte,而中文也会被包含utf8中的,每个中文占用3个byte。

综上:当charset为utf8时,char(5) 这一列可以存储的字节范围是[5*1,5*3],也就是[5,15]。所以上面的两个SQL都能执行成功。


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_04


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql


嗯,是的自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_21。大家都在说varchar存储可变长度的字符串、char用来存储不可变长度的字符串。其实当使用的字符集编码不同时,char能存储的字节数是会变化的!


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_mysql


那你在看下面的这个例子:

创建表:

create table t(a varchar(2)) charset=utf8 engine = innoDB;

插入数据:

insert into t4 select 'abcd';

你注意,a列为varchar类型,且的长度为2。

你绝对上面的insert sql会执行成功嘛?会不会出现"abcd"被截断成"ab",然后仅仅将"ab"存储进数据库的情况?


嗯,很明显varchar的期望长度是2,但是你插入的字符串长度为4。这时sql是否能执行成功取决你 sql mode。

当sql mode为严格(strict)模式时。下图中的sql_mode中的 strict_trans_tables表示开启了严格模式

自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_23

上面的insert sql就会报错

自导自演的面试现场:说说char 和 varchar的区别你了解多少?_字符串_24

当sql mode设置为非严格,再重试会发现:MySQL将超出2字符以外的字符砍掉了。保留下"ab",然后保存进数据库中

自导自演的面试现场:说说char 和 varchar的区别你了解多少?_字符串_25


自导自演的面试现场:说说char 和 varchar的区别你了解多少?_sql_04


举报

相关推荐

0 条评论