当前位置: 首页 > news >正文

MySQL CHAR 和 VARCHAR 的区别

文章目录

  • 1.区别
    • 1.1 存储方式不同
    • 1.2 最大长度不同
    • 1.3 尾随空格处理方式不同
    • 1.4 读写效率不同
  • 2.小结
  • 参考文献

在 MySQL 中,CHAR 和 VARCHAR 是两种不同的文本数据类型,CHAR 和 VARCHAR 类型声明时需要指定一个长度,该长度指示您希望存储的最大字符数。例如,CHAR(30) 最多可以容纳 30 个字符。

它们虽然相似,但存在一些重要区别。

1.区别

根据 MySQL 的官方文档 The CHAR and VARCHAR Types 中的描述, varchar和char的区别主要有:

1.1 存储方式不同

char(N) 定长存储。最多存储 N 个字符,字符数没超出则用空格填充,超过就会被截断,超过的部分丢弃。(如果是严格模式,则会拒绝插入并提示错误信息)

varchar(N) 变长存储。最多存储 N 个字符,没超出则有几个存储几个,超过就会被截断,超过的部分丢弃。(如果是严格模式,则会拒绝插入并提示错误信息)

此外,VARCHAR 在数据前存储为1字节或2字节的长度。长度前缀表示值中包含的字节数。如果值需要不超过255个字节,则列使用一个字节,如果值需要超过255个字节,则使用两个字节。

下表通过显示将各种字符串值存储到 CHAR(4) 和 VARCHAR(4) 列中的结果来说明 CHAR 和 VARCHAR 之间的区别(假设该列使用单字节字符集,如 latin1)。

ValueCHAR(4)Storage RequiredVARCHAR(4)Storage Required
‘’’ ’4 bytes‘’1 byte
‘ab’'ab ’4 bytes‘ab’3 bytes
‘abcd’‘abcd’4 bytes‘abcd’5 bytes
‘abcdefgh’‘abcd’4 bytes‘abcd’5 bytes

表最后一行显示的值仅在不使用严格 SQL 模式时才适用;如果启用严格模式,则不会存储超过列长度的值,并导致错误。

1.2 最大长度不同

char 最大长度为 255 个字符,和字符编码无关。varchar 最大长度为 65,535 字节,注意 varchar 最大长度是字节,因为该上限为行的最大长度。

1.3 尾随空格处理方式不同

char 取出时会将尾随空格去掉,而 varchar 不会。

例如 char(10),保存字符串"hello "(末尾有一个空格),存到数据库就是"hello “(有5个空格),然后查询出来只是"hello”(没有空格),占10个字节。

varchar(10),保存字符串"hello "(有一个空格),存到数据库就是"hello "(有1个空格),查询出来也是"hello "(有1个空格),占 6 个字节。

1.4 读写效率不同

char 存取效率比 varchar 要高,因为其长度固定,数据库系统可以更容易地计算位置和长度。但这也意味着占用更多的磁盘空间,可谓是以空间换时间。

而 varchar 则刚好相反,节省空间但存取效率相对较低。

2.小结

如果你需要固定长度的数据,一般是在存储数据长度差异不大的时候使用 CHAR,但要注意它会浪费存储空间。如果你需要更有效地使用存储空间或处理可变长度的数据,可以使用 VARCHAR。

通常,大部分情况下,VARCHAR更为常见,因为它更节省空间。


参考文献

11.3.2 The CHAR and VARCHAR Types - mysql.com
Section 5.1.11 Server SQL Modes
MySQL中char与varchar的区别:存储机制、性能差异

http://www.lryc.cn/news/217176.html

相关文章:

  • 虚拟机 ping: www.baidu.com:未知的名称或服务
  • 第二章 Python字符串处理
  • 混合编程 ATPCS规范及案例(汇编调用C、C调用汇编、内联汇编)
  • 使用Gorm进行CRUD操作指南
  • Linux0.11内核源码解析-exec.c
  • 百度竞价排名推广对比自然排名哪一个更具优势-华媒舍
  • python第一课 变量
  • shell之netstat的用法
  • MSQL系列(十二) Mysql实战-为什么索引要建立在被驱动表上
  • C语言,数据结构指针,结构构体操作符 •,->,*的区别,看这篇就够了
  • axios 多个baseURL配置、实现不同前缀代理到不同的服务器的几种方式
  • Diango项目-简易个人博客项目
  • 思维训练3
  • 初识FFmpeg
  • 分布式多主关系数据库的底线业务优势
  • JMM讲解
  • 小程序获取头像和昵称的思路
  • 关于docker网络实践中遇到的问题
  • C#完成XML文档节点的自动计算功能
  • 体验SOLIDWORKS旋转反侧切除增强 硕迪科技
  • 分布式ID系统设计(3)
  • 工作备忘录【微信】
  • Window下SRS服务器的搭建
  • Canvas绘制简易雨滴碰撞效果
  • 【五、http】go的http的信息提交
  • 第六讲:VBA与ACCESS的ADO连接中,所涉及的对象
  • 【计算机网络】同源策略及跨域问题
  • uniapp在APP端使用swiper进行页面不卡顿滑动
  • 遗憾
  • hustoj 平台