【MySQL】CHAR 与 VARCHAR 在不同存储引擎的区别

185 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

在 MySQL 中,保存字符串的常用类型有 CHARVARCHAR ,本文将介绍二值的特定以及在不同的数据库引擎下的区别。

CHAR

CHAR 列的长度固定为创建表时声明的长度,即对于声明为 CHAR(n) 的列,其长度为 n 字符,其中 n 的值为 0~255。如果保存的字符串长度不到 n ,则会在字符串右侧填充空格,以达到该长度。但检索到 CHAR 类型的值时,尾部的空格会被删除。

VARCHAR

VARCHAR列的长度是可变的,对于声明为 VARCHAR(n) 的列,其最大有效长度为 n,其中 n 的值为 0~65535。

在 MySQL 4.1 之前的版本,n 指的是 n 字节。也就是说,如果存放的是 UTF-8 的汉字,那么 n=50 时最多只能存放 n/3=16 个汉字(每个汉字3字节)。

从MySQL 4.1版本开始,n 指的是 n 字符,也就是 n=50 时,无论存放的是数字、字母还是UTF-8汉字,都可以存放50个。

CHARVARCHAR 区别

从上面的介绍中,可以看到二值的区别如下:

  • 存: CHAR 为固定长度,VARCHAR 为可变长度
  • 取: CHAR 会去掉尾部空格,VARCHAR (如果尾部有空格)会保留尾部空格

不同数据库存储引擎中二者的区别

  • MyISAM 存储引擎:建议使用 CHAR 类型列代替 VARCHAR 类型。
    • 静态格式是 MyISAM 表的默认存储格式。当表不包含变量长度列(如 VARCHAR)时,使用这个格式。静态格式是最简单最安全且最快的格式。
    • 如果一个 MyISAM 表包含任何可变长度列(如 VARCHAR),则动态存储格式。动态存储格式格式复杂,对于较长的数据会出现记录碎片化的问题。
  • Memory 存储引擎:使用固定长度的数据行存储,因此无论使用 CHAR 还是 VARCHAR,都是作为 CHAR 类型处理。
  • Innodb 存储引擎:建议使用 VARCHAR 类型。
    • 对于 innodb 数据表,内部使用指向数据列值的头指针,没有区分固定长度和可变长度列,因此在本质上,使用固定长度的 CHAR 列不一定比使用可变长度 VARCHAR 的性能要好。

    • 存储总量方面,CHAR 平均占用的空间多于 VARCHAR,使用 VARCHAR 可以减少存储总量和磁盘I/O。