MySQL中char 与varchar的区别

发布于:2024-04-07 ⋅ 阅读:(116) ⋅ 点赞:(0)

在数据库中,CHARVARCHAR 是两种用于存储字符串的数据类型,它们之间有以下区别:

  1. 存储方式

    • CHAR固定长度的字符类型。它会在存储数据时,将字符串填充到指定长度,并在末尾补足空格字符,以保证达到指定长度。
    • VARCHAR可变长度的字符类型。它会根据存储的实际数据长度来分配存储空间,不会浪费额外的空间用于填充。
    • char最大长度是255字符,varchar最大长度是65535个字节。
  2. 存储空间

    • CHAR:由于存储的是固定长度的字符串,所以它的存储空间是固定的。例如,如果定义一个长度为 10 的 CHAR 字段,那么无论实际存储的字符串长度是多少,它都会占用 10 个字符的存储空间。
    • VARCHAR:存储的实际数据长度会影响它所占用的存储空间。例如,如果定义一个长度为 10 的 VARCHAR 字段,而实际存储的字符串长度只有 5 个字符,那么它只会占用 5 个字符的存储空间,而不会浪费额外的空间。
  3. 性能和存取

    • 由于 CHAR 类型的数据是固定长度的,因此在存取时速度可能会比较快,特别是当存储的字符串长度固定且较长时
    • VARCHAR 类型的数据由于存储的是实际长度,因此在存取时可能会稍慢一些,特别是当存储的字符串长度不固定或者变化较大时

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

我们可以看到char类型在存放数据的时候,中间是没有间隔的,数据本身是有空格的,但是数据段之间没有间隔,因为我们在创建列的时候已经告诉MySQL列的长度了,MySQL在查询数据的时候,只需要按部就班寻找就行了,不需要在中途计算这个数据段的长度。
但是varchar类型的存放就不同了,在每个数据段开头,都要有一段空间(1~2个字节)存放数据段的长度,在数据段的结尾还有一段空间(1个字节)标记此字段的节数。MySQL在读取一个数据段的时候,首先要读开头,比如读到了3,说明数据段的长度是3,之后就不多不少,只读3个字节。所以MySQL在遍历数据的时候,磁针要比char类型的列多读很多次磁盘来获取字段的真实长度,这就是为什么varchar比char查询效率低的原因了。

  1. 适用场景
    • CHAR 适合存储长度固定的字符串,例如性别、国家代码等。
    • VARCHAR 适合存储长度不固定的字符串,例如姓名、地址等。
    • 存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占1个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
    • 固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占1个长度信息。
    • 十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

总的来说,如果你知道数据的长度是固定的,可以考虑使用 CHAR 类型;如果数据的长度是不确定的或者变化较大,可以考虑使用 VARCHAR 类型。


网站公告

今日签到

点亮在社区的每一天
去签到