MySQL VARCHAR数据类型

2024年10月21日 MySQL VARCHAR数据类型 极客笔记

MySQL VARCHAR数据类型

MySQL中的VARCHAR是一种用于存储文本的数据类型,其长度最大可以为 65535个字符 。表中的varchar列是可变长度字符串,可容纳数字、字符或两者。在5.0.3版本之前,这种数据类型只能存储255个字符,但在该版本及以后版本中,它可以容纳多达65535个字符。它可以在MySQL中以 1字节或2字节 长度前缀加实际大小的形式存储。

长度前缀指定了字符串值的字节长度,而不是我们设置的最大大小。如果值不超过255个字节,列将使用长度前缀加1个字节。如果值超过255个字节,列将使用长度前缀加2个字节。

VARCHAR在MySQL中的最大长度取决于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会产生错误。这意味着最大行大小不能超过65535字节。无论如何,如果超过了这个限制,语句将失败,并且MySQL将生成一个错误。

在另一个情况下,假设我们已经使用以下语句创建了一个名为 Test3 的表:

CREATE TABLE Test3 (
    Id INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(5) NOT NULL
);

接下来,使用以下语句将值插入表中:

INSERT INTO Test3(Name) VALUES ('Stephen');

现在,执行上述语句。MySQL会给出以下错误信息: 数据太长,超过了’Name’列的长度,在第1行 。输出更清楚地解释了这一点。

MySQL VARCHAR和空格

当存储varchar值时,MySQL不会为其填充空格。当存储或检索varchar值时,MySQL也会保留尾随空格。我们可以通过以下示例理解,其中一个 插入语句 向 名称 列的 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 ');

上述语句将一个长度为 six 的值插入到名字列中。值仍然被插入到该列中,但MySQL会截断尾部的空格再添加该值。我们可以使用以下查询进行验证,我们可以看到插入语句已成功添加,但带有以下警告:

在第1行的’name’列上截断的数据 :

字符和varchar数据类型的区别

char和varchar数据类型都是按照ASCII字符来存储的。它们在存储和检索数据库中的数据方面几乎相同,但存在一些关键的差异。以下表格总结了char和varchar数据类型之间的主要区别:

CHAR VARCHAR
它代表字符型。 它代表可变字符型。
它在创建表时以声明的固定长度存储值。 它以变长字符串形式存储值,并带有一或两个字节的长度前缀。
这种数据类型可以通过尾随空格进行填充,以保持指定的长度。 这种数据类型在存储时不能被任何字符(包括空格)填充。
它不能容纳超过255个字符。 它最多可以容纳65535个字符。
它支持静态内存分配。 它支持动态内存分配。

本文链接:http://so.lmcjl.com/news/15923/

展开阅读全文