📅  最后修改于: 2020-11-19 02:04:14             🧑  作者: Mango
MySQL中的Varchar是用于存储文本的数据类型,其长度最多可包含65535个字符。表中的varchar列是可变长度的字符串,可以容纳数字或字符或两者兼有。此数据类型在版本5.0.3之前只能存储255个字符,但在此版本及更高版本中,最多可以存储65535个字符。它可以以1字节或2字节长的前缀加上实际大小的形式存储在MySQL中。
长度前缀指定字符串值的字节长度,而不是我们设置的最大大小。如果值不需要超过255个字节,则列使用长度前缀加一个字节。如果值需要超过255个字节,则列将使用长度前缀加两个字节。
MySQL中VARCHAR的最大长度取决于65,535字节的最大行大小,除TEXT / BLOB列和所使用的字符集外,所有列均共享该最大行大小。这意味着总列不得超过65535个字节。
让我们借助示例了解它。
我们将创建两个表并将其命名为Test1和Test2。两个表都包含两个名为T1和T2的列。执行以下语句以创建表“ Test1”:
CREATE TABLE Test1 (
T1 VARCHAR(32765) NOT NULL,
T2 VARCHAR(32766) NOT NULL
) CHARACTER SET = 'latin1' COLLATE LATIN1_DANISH_CI;
上面的语句成功创建了一个表,因为列长度T1 = 32765 + 2个字节,T2 = 32766 + 2个字节等于65535(32765 + 2 + 32766 + 2)。因此,列长度满足varchar的最大行大小,即65535。
现在,我们将看到如果列大小超过varchar 65535的最大大小会发生什么。执行以下语句,在此我们增加了列T1的大小以创建表Test2:
CREATE TABLE Test2 (
T1 VARCHAR(32770) NOT NULL,
T2 VARCHAR(32766) NOT NULL
) CHARACTER SET = 'latin1' COLLATE LATIN1_DANISH_CI;
执行上述语句后,MySQL会产生错误。这意味着最大行大小不能超过65,535字节。在任何情况下,如果增加,则该语句将失败,并且MySQL将生成错误。
在另一种情况下,假设我们使用以下语句创建了一个名为Test3的表:
CREATE TABLE Test3 (
Id INT PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(5) NOT NULL
);
接下来,使用以下语句将值插入表中:
INSERT INTO Test3(Name) VALUES ('Stephen');
现在,执行上面的语句。 MySQL给出错误消息:行1的“名称”列的数据太长。输出更清楚地说明了这一点。
当存储varchar值时,MySQL不会填充空间。当它们存储或检索varchar值时,MySQL还保留了尾随空格。我们可以通过以下示例来理解它,在该示例中,insert语句在表Test3的“名称”列中添加值:
INSERT INTO Test3(Name) VALUES ('John ');
接下来,执行SELECT语句以检索值。
SELECT Id, Name, length(Name) FROM Test3;
它将给出以下输出,其中MySQL在长度计数中包括了尾随空格,因为它不会增加列的长度。
但是,当我们尝试插入一个varchar值且尾随空格超过列长度时,MySQL将截断尾随空格。另外,MySQL发出警告。以下示例对其进行了更清晰的说明:
INSERT INTO Test3(Name) VALUES ('Peter ');
上面的语句在name列中插入一个长度为6的值。该值仍插入列中,但是MySQL在添加该值之前会截断尾随空格。我们可以使用以下查询进行验证,在该查询中我们可以看到成功添加了insert语句,但带有以下警告:数据在第1行的“名称”列被截断了:
char和varchar数据类型都遵循ASCII字符。它们几乎相同,但是在存储和从数据库检索数据方面有所不同。下表总结了char和varchar数据类型之间的本质区别:
CHAR | VARCHAR |
---|---|
It stands of character. | It stands for variable character. |
It stores the values in fixed length that we declare while creating a table. | It stores the values in a variable-length string with one or two-byte length prefix. |
This data type can be padded with trailing space to keep the specified length. | This data type cannot be padded with any character, including space, when they are stored. |
It cannot hold more than 255 characters. | It can hold up to 65535 characters. |
It supports static memory allocation. | It supports dynamic memory allocation. |