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

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

换一种写作风格,自导自演面试现场!感觉这样还是比较有趣的,欢迎大家订阅我的MySQL专题,公众号首发!持续更新中~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

点击阅读原文,格式会好看一点哦~

欢迎关注白日梦,公众号首发!持续连载中




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 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",然后保存进数据库中






白日梦补充:
点击了解之前的笔记:sql_mode与日期类型的爱恨情仇?

推荐阅读

  1. MySQL的修仙之路,图文谈谈如何学MySQL、如何进阶!(已发布)
  2. 面前突击!33道数据库高频面试题,你值得拥有!(已发布)
  3. 大家常说的基数是什么?(已发布)
  4. 讲讲什么是慢查!如何监控?如何排查?(已发布)
  5. 对NotNull字段插入Null值有啥现象?(已发布)
  6. 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)
  7. 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)
  8. 你知道数据库缓冲池中的LRU-List吗?(已发布)
  9. 谈谈数据库缓冲池中的Free-List?(已发布)
  10. 谈谈数据库缓冲池中的Flush-List?(已发布)
  11. 了解脏页刷回磁盘的时机吗?(已发布)
  12. 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)
  13. 听说过表空间没?什么是表空间?什么是数据表?(已发布)
  14. 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)
  15. 谈谈MySQL的行记录是什么?长啥样?(已发布)
  16. 了解MySQL的行溢出机制吗?(已发布)
  17. 说说fsync这个系统调用吧! (已发布)
  18. 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)
  19. 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)
  20. MySQL的崩溃恢复到底是怎么回事? (已发布)
  21. MySQL的binlog有啥用?谁写的?在哪里?怎么配置 (已发布)
  22. MySQL的bin log的写入机制 (已发布)
  23. 删库后!除了跑路还能干什么?(已发布)
  24. 自导自演的面试现场,趣学数据库的10种文件(已发布)
  25. 大型面试现场:一条update sql执行都经历什么?(已发布)
  26. 大型翻车现场:如何实现记录存在的话就更新,如果记录不存在的话就插入。(已发布)

最后,欢迎关注白日梦的公号哦~

换一种写作风格,自导自演面试现场!感觉这样还是比较有趣的,欢迎大家订阅我的MySQL专题,公众号首发!持续更新中~

面试现场:说说char 和 varchar的区别你了解多少?的更多相关文章

  1. 面试官疯狂问我:char和varchar的区别 怎么办?愣着干嘛?进来白嫖啊!

    MySQL的修仙之路,图文谈谈如何学MySQL.如何进阶!(已发布) 面前突击!33道数据库高频面试题,你值得拥有!(已发布) 大家常说的基数是什么?(已发布) 讲讲什么是慢查!如何监控?如何排查?( ...

  2. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  3. MYSQL—— char 与 varchar的区别!

    一.char 和 varchar 的区别: 1)取值范围: char:取值范围:0~255 varchar:取值范围:0~65535 2)空间占用与速度: char: 定长字符串,占用空间大,速度快, ...

  4. char与varchar的区别

    char的长度是不可变的,而varchar的长度是可变的,也就是说, 定义一个char[10]和varchar[10],如果存进去的是‘csdn’, 那么char所占的长度依然为10, 除了字符‘cs ...

  5. 简单了解char和varchar的区别

    一.CHAR和 VARCHAR的区别? 1.CHAR有固定的长度,VARCHAR属于可变长度的字符类型. 2.比如,写入内容到CHAR(10)里,如果内容占用的空间不够10,则会用空格字符补足. 二. ...

  6. 通过char与varchar的区别,学习可变长的字符类型

    转自http://www.uphtm.com/database/232.html 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  7. 【面试虐菜】—— Oracle中CHAR、VARCHAR的区别

    1.CHAR. CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取 ...

  8. mysql中char与varchar的区别

    在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类型,一般参考的都是char或者varchar,这两种选择有时候让人很纠结,今天想总结一下它们两者的区别,明确一下选择塔 ...

  9. MySQL数据库char与varchar的区别分析及使用建议

    在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...

随机推荐

  1. IFIX 5.9 报警存sql

    环境 win7x64 + ifix 5.9 + sql server 2008 (sql 我装在了别的win10的机器上,和ifix的win7不在同一个机器,网是通的) 1 安装sql server ...

  2. 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...

  3. vue slot nested bug

    vue slot nested bug slot name bug Error <slot name="global-system-guide-slot"></s ...

  4. OAuth 2.0 All In One

    OAuth 2.0 All In One 授权类型 授权代码 隐式 密码凭证 客户端凭证 授权码 授权码授予类型要求用户向提供者进行身份验证-然后将授权码发送回客户端应用程序,提取并与提供者交换以获取 ...

  5. how to measure function performance in javascript

    how to measure function performance in javascript Performance API Performance Timeline API Navigatio ...

  6. vuex bug & vue computed setter

    vuex bug & vue computed setter https://vuejs.org/v2/guide/computed.html#Computed-Setter [Vue war ...

  7. how to get window width in javascript

    how to get window width in javascript how to get window width in js How to Detect Screen Resolution ...

  8. NGK新加坡峰会:超级节点和开源代码为DeFi生态带来新曙光!

    据伦敦金融时报以及纽约商业报等多家媒体报道的消息,1月31日,2021 NGK区块链峰会于新加坡正式开幕,全球多位区块链研究所专家线上受邀出席参会,NGK灵石技术研发Clifton先生,法国区块链专家 ...

  9. NGK Global-下一个千亿市场来袭

    6月4日,NGK Global开启了全球巡回路演,NGK全球社区经过激烈的讨论,最终决定由美国社区发起,在纽约举办NGK Global第一场路演. 路演讲师Viko就NGK的IPFS协议以及NGK未来 ...

  10. java自学第3期——继承、多态、接口、抽象类、final关键字、权限修饰符、内部类

    一.继承: 关键字extends /* 定义一个父类:人类 定义父类格式:public class 父类名称{ } 定义子类格式:public class 子类名称 extends 父类名称{ } * ...