MySQL数据类型:VARCHAR和CHAR

254 阅读5分钟

MySQL数据类型:VARCHAR和CHAR

Brian Morrison [hudson译]

9/30/2022

概述

是否曾经发现自己在构建数据库时,总是开始质疑应该为特定列使用哪些数据类型?在MySQL数据类型系列的这篇开篇文章中,我们将探讨将字符串和文本保存到数据库的各种方法,以帮助你了解作为开发人员的各种选项,让我们从VARCHARCHAR开始。

VARCHAR与CHAR

VARCHAR可能是字符串使用最广泛的数据类型。它存储可变长度的字符串,最多65535个字符。创建VARCHAR字段时,可以使用VARCHA(n)格式指定字段将接受的最大字符数,其中n是要存储的最大字符数量。由于这是可变长度的事实,它将只分配足够的磁盘空间来存储字符串的内容,而不是传入内容的完整长度。 VARCHAR还为存储的每个值分配了一点额外的空间。根据存储数据所需的空间,将分配1或2字节的开销。如果所需空间小于255字节,将添加1字节前缀,否则将使用2字节前缀。存储值所需的确切空间取决于所使用的字符集(更多信息取决于该字符集)。

CHAR是另一种存储字符串的方法,但它的最大长度为255,并且是固定长度。与VARCHAR一样,您可以选择使用CHAR(n)格式设置CHAR字段中的最大字符数。如果未指定,n默认为1。存储在CHAR列中的值用空格右填充,因此无论保存的字符串是什么,它都将始终存储n字符。在某些情况下,这实际上可以提高数据库的性能。

分解字符集

虽然大多数编程语言使用英语中的字符,但世界各地的人们使用不同类型的字符进行书写和阅读。这可以是一些简单的东西,比如西班牙语中的“尼奥”,也可以是一些非常不同的东西,例如データベース 日语。为了解决这个问题,MySQL有不同的字符集(或字符集)来处理不同语言中使用的符号。字符集影响文本在数据库中的存储方式,但也影响保存数据时分配的存储空间量。

例如,当使用默认字符集“utf8mb4`时,MySQL将为存储的每个字符分配4个字节。考虑到这一点,再加上所有列的最大行大小为65535字节,实际上,由于每个字符的存储要求,您只能创建最大长度为16383个字符的“VARCHAR”列。

可视化差异

将数据保存到“CHAR”字段时,一个副作用是,保存值时字符串中的任何尾部空格实际上都会丢失。事实上,当您从“CHAR”列查询数据时,MySQL甚至不会返回尾随空格,因为它必须假设额外的空格只是填充。 为了演示这一点,让我们创建一个包含两列的表,一列是VARCHAR(20),另一列是` CHAR(20。然后,我们将在末尾插入一些带有五个空格的数据,以查看它是如何存储的。

CREATE TABLE strings(
   id INT PRIMARY KEY AUTO_INCREMENT,
   variable VARCHAR(20),
   fixed CHAR(20)
);
INSERT INTO strings (variable, fixed) VALUES ("Drifter     ", "Drifter     ");

现在,如果我运行下面的SELECT语句,返回的数据似乎是相同的。

SELECT * FROM strings;

SELECT语句的输出

但是,如果我使用CHAR_LENGTH函数来计算每个字段中使用的字符数,您会注意到存储在VARCHAR字段(用VARCHAR_data_LENGTH表示)中的数据是12,它考虑了末尾的5个额外空格字符,而CHAR字段只显示7。这是因为MySQL在VARCHAR值的末尾存储了空格,但它假定“CHAR”值末尾的额外空格是根据数据类型附加的填充。

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

使用CONCAT的SELECT语句的输出

如前所述,将数据写入磁盘时,VARCHAR值也会产生额外的开销。这意味着,如果要存储长度为6个字符的字符串“Spider”,并且同时将其存储在VARCHAR(6)CHAR(6)VARCHAR值将使用25个字节的磁盘空间(使用utf8mb4字符集每个字符4个字节加上1个字节的开销),而CHAR值则使用24个字节。

但是,如果将“Eido”存储在相同的列中,VARCHAR将只使用5个字节,而CHAR仍将使用6个字节。由于CHAR数据类型是固定长度的,因此它右填充了2个空格,总共6个。

ValueVARCHAR(6) Stored valueVARCHAR(6) Space usedCHAR(6) Stored valueCHAR(6) Space used
"Spider""Spider"25 bytes"Spider"24 bytes
"Eido""Eido"17 bytes"Eido "24 bytes
"Eido ""Eido "25 bytes"Eido "24 bytes

何时使用VARCHAR还是CHAR

现在您已经了解了“VARCHAR”和“CHAR”之间的区别,下面是一些关于确定哪种数据类型最适合您的应用程序的提示:

在以下情况下使用VARCHAR

  • 您需要存储超过255个字符的字符串。
  • 您发现自己在一个罕见的场景中需要保留尾随空格。

在以下情况下使用CHAR

  • 您的长度不超过255个字符,并且您总是知道字符串的长度。
  • 固定长度的序列号可以很好地说明“CHAR”何时有用。