SQL 中的 CHAR 与 VARCHAR

17 Mar 2025 | 4 分钟阅读

引言

在数据库管理系统(DBMS)如 SQL(结构化查询语言)方面,选择正确的数据类型对于高效地存储和检索数据至关重要。在用于存储文本数据的常用数据类型中,CHAR 和 VARCHAR 是最常见的。虽然它们都满足相似的需求,但它们之间存在特定的差异,这些差异会影响数据库性能和存储效率。在本文中,我们将深入探讨 SQL 中 CHAR 和 VARCHAR 之间的区别。

CHAR 数据类型

在 SQL 中,CHAR 数据类型用于存储固定长度的字符字符串。当您定义一个 CHAR 类型列时,您需要指定它可以容纳的数据的精确长度。这意味着,无论数据的实际长度如何,存储在 CHAR 列中的每个值都将占用指定的字符数。

例如,如果您将一个列指定为 CHAR(10),它将始终占用 10 个字符的存储空间,即使该列中存储的实际文本较短。如果字符串的长度小于指定的长度,它将用尾部空格填充以填满该空间。

以下是 CHAR 数据类型的简要概述:

  • 固定长度: CHAR 列始终占用预定义的长度,如果需要,会用尾部空格填充数据以满足定义的长度。
  • 适用于固定长度数据:CHAR 通常用于您拥有长度一致的数据时,例如邮政编码或固定长度的代码。

CHAR 在您希望确保列中的每个值都具有一致长度的情况下很有用,但在存储较短字符串时可能会导致存储空间浪费。

VARCHAR 数据类型

在 SQL 中,VARCHAR 是“Variable character”(可变字符)的缩写,是一种用于存储可变长度字符字符串的数据类型。与存储固定长度字符串的 CHAR 不同,VARCHAR 列仅使用存储实际数据所需的存储空间,而不会用尾部空格浪费空间。

当您定义一个 VARCHAR 数据类型的列时,您需要指定它可以容纳的最大数据长度,但实际使用的存储空间取决于存储的数据长度。例如,如果您将一个列定义为 VARCHAR(50),它可以存储最多 50 个字符长的字符串,但只使用存储实际数据所需的存储量。

  • 可变长度: VARCHAR 列仅占用存储实际数据所需的存储空间,没有填充。
  • 适用于可变长度数据: VARCHAR 通常用于您拥有长度可变的数据时,例如姓名、地址或描述。
  • 存储高效: 与 CHAR 相比,VARCHAR 可以节省存储空间,尤其是在存储较短字符串时。

VARCHAR 是一种通用的数据类型,通常在 SQL 数据库中用于高效存储长度可变的文本数据。

示例

在此模式中

  • EmployeeID 和 Department 被声明为 CHAR,因为它们具有固定长度。
  • FirstName、LastName、Address 和 JobTitle 被声明为 VARCHAR,因为它们的长度可能不同。

以下是将数据插入此表的示例:

以及用于检索员工信息的查询:

输出

CHAR vs VARCHAR in SQL

以下是 CHAR 和 VARCHAR 之间的区别:

基础CHARVARCHAR
存储分配固定长度存储分配,用空格填充字符串以达到定义的长度。可变长度存储分配,仅存储实际字符,不进行填充。
存储效率存储效率较低,尤其是对于较短的字符串,因为它总是使用定义的长度。存储效率更高,尤其是对于较短的字符串,因为它只占用必要的存储空间。
填充 (Padding)自动用空格填充字符串以达到预定义的长度。不填充字符串;它仅存储提供的实际字符。
空间利用由于填充,在存储较短字符串时可能会导致空间浪费。通过根据实际数据长度动态调整存储来避免空间浪费。
性能由于存储大小可预测,对于固定长度数据可能提供轻微的性能优势。由于可变长度存储分配,在某些情况下可能会稍慢。
内存使用由于固定长度存储,可能消耗更多内存。通常消耗的内存较少,尤其是在存储较短字符串时。
索引对 CHAR 列进行排序可能更快,因为存储是固定的。对 VARCHAR 列进行排序可能稍慢,因为存储是可变的。
适用性适用于固定长度数据,如邮政编码、国家代码或标识符。适用于姓名、地址或描述等可变长度数据。
数据完整性通过强制执行固定长度约束来确保数据完整性。适应不断变化的数据长度,提供更大的灵活性,但在需要特定长度约束时需要额外的验证。
查询优化由于存储是固定的,这可能导致更可预测的查询执行计划。查询计划可能会因实际数据长度而异,可能会影响优化策略。