面试现场:说说char 和 varchar的区别你了解多少?
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;
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专题,公众号首发!持续更新中~
面试现场:说说char 和 varchar的区别你了解多少?的更多相关文章
- 面试官疯狂问我:char和varchar的区别 怎么办?愣着干嘛?进来白嫖啊!
MySQL的修仙之路,图文谈谈如何学MySQL.如何进阶!(已发布) 面前突击!33道数据库高频面试题,你值得拥有!(已发布) 大家常说的基数是什么?(已发布) 讲讲什么是慢查!如何监控?如何排查?( ...
- mysql中char与varchar的区别分析(补充一句,int和integer没区别)
转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...
- MYSQL—— char 与 varchar的区别!
一.char 和 varchar 的区别: 1)取值范围: char:取值范围:0~255 varchar:取值范围:0~65535 2)空间占用与速度: char: 定长字符串,占用空间大,速度快, ...
- char与varchar的区别
char的长度是不可变的,而varchar的长度是可变的,也就是说, 定义一个char[10]和varchar[10],如果存进去的是‘csdn’, 那么char所占的长度依然为10, 除了字符‘cs ...
- 简单了解char和varchar的区别
一.CHAR和 VARCHAR的区别? 1.CHAR有固定的长度,VARCHAR属于可变长度的字符类型. 2.比如,写入内容到CHAR(10)里,如果内容占用的空间不够10,则会用空格字符补足. 二. ...
- 通过char与varchar的区别,学习可变长的字符类型
转自http://www.uphtm.com/database/232.html 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...
- 【面试虐菜】—— Oracle中CHAR、VARCHAR的区别
1.CHAR. CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取 ...
- mysql中char与varchar的区别
在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类型,一般参考的都是char或者varchar,这两种选择有时候让人很纠结,今天想总结一下它们两者的区别,明确一下选择塔 ...
- MySQL数据库char与varchar的区别分析及使用建议
在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...
随机推荐
- CentOS7安装配置 NFS
一.NFS 简介 NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端N ...
- POJ - 3280 Cheapest Palindrome 【区间dp】【非原创】
Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate ...
- pthread_create函数
函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t *re ...
- μC/OS-III---I笔记10---内存管理
内存管理: 平时经常用到一些windows内存管理的软件,有一些内存管理的软件进行内存碎片的整理,在频繁分配和释放内存的地方会造成大量的内存碎片.内存碎片是如何形成的呢?书中是这样写的:在不断的分配和 ...
- 如何使用 VuePress 搭建一个 element-ui 风格的文档网站
如何使用 VuePress 搭建一个 element-ui 风格的文档网站 { "devDependencies": { "vuepress": "1 ...
- Github OAuth All In One
Github OAuth All In One new https://docs.github.com/en/free-pro-team@latest/developers/apps/authoriz ...
- React.memo All In One
React.memo All In One https://reactjs.org/docs/react-api.html#components React.memo const MyComponen ...
- React 17 All In One
React 17 All In One v17.0.1 https://reactjs.org/blog/2020/10/20/react-v17.html https://reactjs.org/b ...
- GitHub & Hacker & MicroSoft
GitHub & Hacker & MicroSoft GitHub源码被黑客洗劫和勒索事件 微软也未能幸免 https://www.cnbeta.com/articles/tech/ ...
- vscode & ignore .idea
vscode & ignore .idea settings.json .vscode & ignore .idea // 将设置放入此文件中以覆盖默认设置 { "files ...