Hi,大家好!我是白日梦!本文是MySQL专题的第 26 篇。
下文还是白日梦以自导自演的方式,围绕“说说char 和 varchar的区别你了解多少?”展开本话题。看看你能抗到第几问吧
换一种写作风格,自导自演面试现场!感觉这样还是比较有趣的,欢迎大家订阅我的MySQL专题,公众号首发!持续更新中~
点击阅读原文,格式会好看一点哦~
点击阅读原文,格式会好看一点哦~
点击阅读原文,格式会好看一点哦~
公众号后台回复:数据库 可以参与抽奖活动,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;
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 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表示开启了严格模式
上面的insert sql就会报错
当sql mode设置为非严格,再重试会发现:MySQL将超出2字符以外的字符砍掉了。保留下”ab”,然后保存进数据库中
推荐阅读
- MySQL的修仙之路,图文谈谈如何学MySQL、如何进阶!(已发布)
- 面前突击!33道数据库高频面试题,你值得拥有!(已发布)
- 大家常说的基数是什么?(已发布)
- 讲讲什么是慢查!如何监控?如何排查?(已发布)
- 对NotNull字段插入Null值有啥现象?(已发布)
- 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)
- 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)
- 你知道数据库缓冲池中的LRU-List吗?(已发布)
- 谈谈数据库缓冲池中的Free-List?(已发布)
- 谈谈数据库缓冲池中的Flush-List?(已发布)
- 了解脏页刷回磁盘的时机吗?(已发布)
- 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)
- 听说过表空间没?什么是表空间?什么是数据表?(已发布)
- 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)
- 谈谈MySQL的行记录是什么?长啥样?(已发布)
- 了解MySQL的行溢出机制吗?(已发布)
- 说说fsync这个系统调用吧! (已发布)
- 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)
- 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)
- MySQL的崩溃恢复到底是怎么回事? (已发布)
- MySQL的binlog有啥用?谁写的?在哪里?怎么配置 (已发布)
- MySQL的bin log的写入机制 (已发布)
- 删库后!除了跑路还能干什么?(已发布)
- 自导自演的面试现场,趣学数据库的10种文件(已发布)
- 大型面试现场:一条update sql执行都经历什么?(已发布)
- 大型翻车现场:如何实现记录存在的话就更新,如果记录不存在的话就插入。(已发布)
最后,欢迎关注白日梦的公号哦~
换一种写作风格,自导自演面试现场!感觉这样还是比较有趣的,欢迎大家订阅我的MySQL专题,公众号首发!持续更新中~