面试现场:说说char 和 varchar的区别你了解多少? (2)

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


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


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


嗯,你上面的回答总体上是没有问题的。

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

 不过我还有几个问题,想问你一下。假如我的建表语句是这样的:


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都能执行成功。


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


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


嗯,是的

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

。大家都在说varchar存储可变长度的字符串、char用来存储不可变长度的字符串。其实当使用的字符集编码不同时,char能存储的字节数是会变化的!


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


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


创建表:

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表示开启了严格模式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgwzy.html