概述

是否曾经在构建数据库时纠结于为某个字段选择合适的数据类型?在这一篇关于MySQL数据类型的文章中,我们将探讨多种用来将字符串和文本保存到数据库的方法,旨在帮助开发者明确选择,从VARCHAR和CHAR入手。

VARCHAR 和 CHAR 的比较

VARCHAR可能是存储字符串时最广泛使用的数据类型。它用于存储长度可变的字符串,最大可以达到65,535字符。在创建**VARCHAR**字段时,你可以通过VARCHAR(n)的格式指定字段能够接受的最大字符数,其中n是字段可存储的最大字符数。由于其长度是可变的,它只会分配足够存储实际字符串内容所需的磁盘空间,而不会分配传入内容的完整长度。
VARCHAR还会为每个存储的值分配一些额外的空间。根据数据所需的存储空间,可能会分配1或2个字节的额外开销。如果存储空间小于255字节,则会添加1个字节的前缀;否则会使用2字节的前缀。具体存储一个值所需的空间取决于使用的字符集(稍后会详细说明)。
另一方面,**CHAR**也是一种存储字符串的方法,但它的最大长度为255,而且是固定长度的字段。与**VARCHAR**类似,你也可以通过CHAR(n)的方式为**CHAR**字段设定最大字符数。如果n未指定,默认值为1。存储在**CHAR**列中的值会用空格进行右侧填充,因此无论保存的字符串内容是多少,它都会存储n个字符。在某些情况下,这种设计可以提高数据库的性能。

字符集的影响(Charset)

虽然大多数编程语言中使用英文字符,但世界各地的人们读写时会使用各种不同类型的字符。这可能是像西班牙语中的Ñ这样的简单变体,或者是像日语中的データベース这样的完全不同的字符。为了支持各种语言的符号,MySQL提供了不同的字符集(charset)。字符集不仅影响文本在数据库中的存储方式,还会影响存储数据时分配的空间量。
例如,使用MySQL的默认字符集utf8mb4时,每存储一个字符都会分配4字节的存储空间。考虑到存储需求以及MySQL的单行最大大小限制(65,535字节,涵盖所有列),在这样的字符集中,你实际上只能创建最大长度为16,383字符的**VARCHAR**列,因为存储每个字符所需的空间较大。

区别可视化

在向**CHAR**字段存储数据时,一个副作用是任何字符串尾部的空格在保存时实际上都会丢失。事实上,当从**CHAR**列查询数据时,MySQL不会返回尾部的空格,因为它需要假定这些额外的空格只是根据数据类型填充的。
让我们创建一个包含两个列的表:一个是VARCHAR(20),一个是CHAR(20)。然后插入带有5个尾部空格的数据,观察其存储方式:

CREATE TABLE strings(
    id INT PRIMARY KEY AUTO_INCREMENT,
    variable VARCHAR(20),
    fixed CHAR(20)
);

INSERT INTO strings (variable, fixed) VALUES ("Drifter     ", "Drifter     ");

如果运行以下查询语句,会发现返回的数据据表面看起来似乎是相同的:

SELECT * FROM strings;

查询结果: 然而,当我们使用CHAR_LENGTH函数计算每个字段实际存储的字符数时,可以看到,存储在**VARCHAR**字段中的数据(通过varchar_data_length表示)是12,包括结尾的5个空格字符。而**CHAR**字段的值仅显示为7,因为MySQL将尾部的空格视为填充,而不是数据的一部分。

SELECT CHAR_LENGTH(variable) AS varchar_data_length, CHAR_LENGTH(fixed) AS char_data_length FROM strings;

存储空间差异

正如之前提到的,当数据写入磁盘时,**VARCHAR**值会占用额外的开销空间。这意味着,如果存储字符串"Spider"(长度为6字符),且分别存储在VARCHAR(6)CHAR(6)字段中,**VARCHAR**值将占用25字节(每字符4字节的utf8mb4字符集存储加上1字节额外开销),而**CHAR**值占用的是24字节。
但是,如果存储字符串"Eido"(长度为4字符)在同样的字段中,**VARCHAR**将占用17字节,而**CHAR**仍然占用6字节。由于**CHAR**数据类型是固定长度,其会右侧填充2个空格。

VARCHAR(6)存储值VARCHAR(6)使用空间CHAR(6)存储值CHAR(6)使用空间
“Spider”“Spider”25字节“Spider”24字节
“Eido”“Eido”17字节“Eido “24字节
“Eido ““Eido “25字节“Eido “24字节

何时选择 VARCHAR 或 CHAR

现在你已了解**VARCHAR**和**CHAR**的区别,以下是一些建议来帮助你选择合适的数据类型:
使用 VARCHAR 如果:

  • 需要存储超过255字符的字符串。
  • 有保存尾部空格的需求(虽然这样的场景较为少见)。

使用 CHAR 如果:

  • 字符数在255以内,并且字符串长度始终固定。

一个很好例子是固定长度的序列号,这种情况下使用**CHAR**非常合适。



MySQL数据类型:VARCHAR 和 CHAR插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2025/09/08/mysql-varchar-char-2/