鹏仔先生-趣站-一个有趣的网站!
鹏仔先生

鹏仔先生

当前位置:网站首页 > 文字大全 > 正文

用char还是varchar?答案和原理都告诉你

作者:百变鹏仔日期:2023-07-28 02:28:32浏览:10分类:文字大全

用char还是varchar?答案和原理都告诉你

在MySQL中,char和varchar可能是我们最常使用字符串类型。那么到底varchar和varchar有什么不同?我们什么时候使用char,什么时候使用varchar呢?

char是定长的,插入数据不足规定长度的,右边补空格,当然查询出来的数据也会有空格,插入数据超过规定长度,会返回错误 [22001][1406] Data truncation: Data too long for column 'name' at row 1 , MySQL 并不会自动截短字符串。因为char是定长的,所以查询的效率比varchar高(后面会将为什么效率高),但在列容量不能充分利用的情况下会造成一定的空间浪费。

varchar是不定长的,varchar类型的列是不定长的,在5.0版本以后的最大长度是65536字节(2^16),但是这个长度只是“系统长度”,这并不意味着你真的可以完全利用65536字节来存储数据,因为varchar是不定长的,所以需要前两个字节标记字段的实际长度,结尾还要用一个字节表示结束。

需要注意的是65535只是字节个数,而且是理论字节个数,在减去头尾的"系统"占用字节后,只剩下65533可用字节。那么我们建表的时候,能不能直接写varchar(65533)呢?当然是不可以的,因为4.0之后,varchar后面的小括号里就不再是字节长度了,而是字符长度。

字节和字符个数之间的换算关系是根据编码决定的:

我们只列出了常用的编码格式。

那么这是否意味着,在utf8mb4编码下我们可以用varchar(16383)来定义一个列呢?

答案是要看情况,MySQL规定了一个 row 所有的字段加起来总长度不能超过65535字节,所以如果一个表只有一个列,那完全可以用varchar(16383)来定义这个列,如果这个表还有其他列,无论其他列多么短,都是会占用字节数的,所以,使用varchar(16383)来定义的时候, MySQL 会返回错误提示: ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs ,意思是row的容量太大,超出了row的最大容量65535,如果不改变列的长度的话,推荐使用 TEXT or BLOBs 类型。

所以,如果我们要创建一个只包含两个字段的表(编码是utf8mb4),一列是主键,一列是字符串,字符串的最大长度是多少呢?你可以先自己算一下,再往下看。

为什么65535要减去4呢?因为int(11)占4个字节,那么在utf8编码情况下,还是同样的数据结构,article的最大长度有事多少呢?

相信这次你一定算对了。

这是由他们在磁盘上存放的不同形式决定的,我们先来看一个图:

但是varchar类型的存放就不同了,在每个数据段开头,都要有一段空间(1~2个字节)存放数据段的长度,在数据段的结尾还有一段空间(1个字节)标记此字段的节数。 MySQL 在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节。所以 MySQL 在遍历数据的时候,磁针要比char类型的列多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。

我们可以用varchar存放不定长的数据,比如人的名字,或者一篇博客的文章。可以用char存放定长的数据,比如身份证号和手机号,我们把一个列定义为 mobile varchar(11) ,中国大陆的手机号最长,达到11位,香港是8位,瑞士是10位,所以定义成11位完全够用,可以存放各国的手机号了。

除了char和varchar类型,最常用的就是数值类型了,为了方便建表的时候计算列的最大长度,把数值类型占用的字节和值的范围放在这里:

鹏仔 微信 15129739599

百科狗 baikegou.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

  • 上一篇:已经是第一篇了
  • 下一篇:已经是最后一篇了
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)